Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Python- und mySQLdb-Fehler:OperationalError:(1054, Unbekannte Spalte in „Where-Klausel“)

Verwenden Sie keine "String-Injektion" in Ihr SQL, außer in Fällen, in denen es wirklich unverzichtbar ist, wie z. B. str(DEPT) hier, um auszuwählen, aus welcher Tabelle Sie auswählen. Verwenden Sie für jeden anderen Fall stattdessen die Parameterübergabefunktion der Python-DB-API – sie zitiert die Dinge für Sie richtig und verteidigt Sie unter anderem automatisch gegen „SQL-Injection“-Angriffe. (Manchmal kann es auch schneller sein).

Da MySQLdb die unglückliche Schreibweise %s verwendet für Parameter sollten Sie Folgendes tun (auch den Stil so einstellen, dass er PEP8-konform ist, nicht erforderlich, kann aber nicht schaden;-):

conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))

Der %% s in der Zeichenfolgenformatierung, die q erzeugt zu einem einzelnen % werden jeweils beim Formatieren, also q bleibt mit zwei Vorkommen von %s -- die der execute füllt sauber mit korrekt formatierten Versionen von CLASS aus und SEC . Alle str Anrufe sind überflüssig usw.

Abgesehen davon, wenn Sie Python 2.6 oder höher verwenden, sollten Sie für die Zeichenfolgenformatierung das neue format verwenden Methode anstelle des alten % Operator -- das erspart Ihnen neben anderen Vorteilen die Notwendigkeit für diese "verdoppelten %-Zeichen". Ich habe diese Änderung im obigen Snippet nicht angewendet, nur für den Fall, dass Sie bei 2.5 oder früher hängen bleiben (der obige Code funktioniert also in jeder Version von Python, anstatt nur in relativ neuen).