2016-07-26 17 views
0

Ich versuche, eine einfache Abfrage von einer Spalte mit dem Namen N_Number in einer MySQL-Tabelle mit dem folgenden Code zu tun:Python MySQLdb Syntaxfehler mit scheinbar korrekter Syntax

from os.path import join, dirname 
from dotenv import load_dotenv 
import MySQLdb  

TABLE_NAME = 'testmaster' 

dotenv_path = join(dirname(__file__), '.env') 
load_dotenv(dotenv_path) # loads the .env 

dbName = os.environ.get('DB_NAME') 
mydb = MySQLdb.connect(host=os.environ.get('DB_HOST'), user=os.environ.get('DB_USER'), passwd=os.environ.get('DB_PASS'), db=dbName) 
cursor = mydb.cursor() 

cursor.execute("SELECT N_NUMBER FROM %s", (TABLE_NAME,)) 

ich weiterhin die gleiche Traceback jedes Mal bekommen , das ist:

Traceback (most recent call last): 
    File "updateMaster.py", line 101, in <module> 
    cursor.execute("SELECT 'N_NUMBER' FROM %s", (TABLE_NAME,)) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute 
    self.errorhandler(self, exc, value) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''testmaster'' at line 1") 

ich habe auch versucht, die Syntax mit pyformat Stil, wie durch die Dokumentation für die .execute() Methode empfohlen, erhielt aber immer noch die gleichen Fehler. Der pyformat Stil sah aus wie:

cursor.execute("SELECT N_NUMBER FROM %(table_name)s", {'table_name':TABLE_NAME}) 

Wenn ich direkt versuchen, den Tabellennamen in die Befehlsfolge Einfügen den Befehl funktioniert, mir was zu vermuten, dass es etwas mit dem% s zu tun hat. Was läuft falsch?

+1

Sie können keinen Tabellennamen parametrieren: http://stackoverflow.com/questions/15255694/python-mysqldb-execute-table-variable (gleiche gilt auch für Spaltennamen). – alecxe

+0

Vielen Dank! Ich wusste, dass diese Frage wahrscheinlich irgendwo gestellt wurde, aber ich konnte sie nicht finden. – RyMac

Antwort

2

Sie können Tabellen- und Spaltennamen nicht parametrisieren. Während bewusst auf die Möglichkeit SQL Injection Angriffe zu sein, stattdessen tun:

cursor.execute("SELECT N_NUMBER FROM {}".format(TABLE_NAME)) 
+0

Arbeitete perfekt, danke :) – RyMac

+0

Prost, Kumpel. Happy Coding für Sie. – bernie