Errore Python e mySQLdb:Errore operativo:(1054, “Colonna sconosciuta nella clausola 'dove'”)

StackOverflow https://stackoverflow.com/questions/3462707

  •  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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top