Errore Python e mySQLdb:Errore operativo:(1054, “Colonna sconosciuta nella clausola 'dove'”)
-
27-09-2019 - |
Domanda
Ciao a tutti, ricevo un errore
Errore operativo:(1054, "Colonna sconosciuta 'XX' nella clausola 'dove'")
Dove XX è il valore di CLASS nel codice seguente
conn = MySQLdb.connect(host = "localhost",user = "user", passwd = "pass",db = "dbase")
cursor = conn.cursor()
cursor.execute("""SELECT * FROM %s WHERE course =%s AND sec = %s""" % (str(DEPT),str(CLASS),str(SEC),))
Il fatto è che ottengo questo errore solo con determinati valori, vale a dire quando CLASS contiene una lettera.Se questo aiuta, ho impostato il tavolo come varchar
Grazie!
Soluzione
Non utilizzare la "string injection" nel tuo SQL tranne nei casi in cui è veramente indispensabile, come il str(DEPT)
qui per scegliere da quale tabella selezionare.Per ogni altro caso, utilizza invece la funzionalità di passaggio dei parametri dell'API DB Python: 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 utilizza la sfortunata notazione %s
per i parametri, ecco cosa dovresti fare (correggere anche lo stile affinché sia conforme a PEP8, non richiesto ma non può far 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
diventare un singolo %
ciascuno al momento della formattazione, quindi q
rimane con due occorrenze di %s
- quale il execute
si riempie 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 successivo, per la formattazione delle stringhe dovresti usare new format
metodo invece del vecchio %
operator - che ti evita la necessità di quei "segni% raddoppiati", tra gli altri vantaggi.Non ho applicato questa modifica nello snippet sopra nel caso in cui tu sia bloccato con la versione 2.5 o precedente (quindi il codice sopra funziona in qualsiasi versione di Python, invece che solo in quelle ragionevolmente recenti).
Altri suggerimenti
Invece di:
course=%s
Penso che tu abbia bisogno di:
course='%s'
Ho avuto lo stesso errore, ho appena aggiunto un nuovo campo nel mio modello e tabella, ad es.campo identificativo.e funziona correttamente.