Mysql
 sql >> Database >  >> RDS >> Mysql

Errore Python e mySQLdb:OperationalError:(1054, colonna sconosciuta in "clausola where")

Non usare "string injection" nel tuo SQL tranne nei casi in cui è veramente indispensabile, come str(DEPT) qui per scegliere da quale tabella stai selezionando. Per ogni altro caso, usa invece la funzione di passaggio dei parametri dell'API Python DB:citerà le cose correttamente per te e ti difenderà automaticamente dagli attacchi "SQL injection", tra le altre cose. (Può anche essere più veloce, a volte).

Poiché MySQLdb usa la sfortunata notazione %s per i parametri, ecco cosa dovresti fare (fissando anche lo stile in modo che sia conforme a PEP8, non richiesto ma non fa male;-):

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))

Il %% s nella formattazione della stringa che produce q diventa un unico % ciascuno durante la formattazione, quindi q rimangono due occorrenze di %s -- che execute si integra perfettamente con le versioni formattate correttamente di CLASS e SEC . Tutti i str le chiamate sono ridondanti, ecc.

Per inciso, se utilizzi Python 2.6 o versioni successive, per la formattazione delle stringhe dovresti usare il nuovo format metodo invece del vecchio % operatore -- che ti salva dalla necessità di quei "segni di % raddoppiati", tra gli altri vantaggi. Non ho applicato quella modifica nello snippet sopra nel caso tu sia bloccato con 2.5 o precedenti (quindi il codice sopra funziona in qualsiasi versione di Python, invece che solo in quelle ragionevolmente recenti).