sql >> Databasteknik >  >> RDS >> Mysql

Python och mySQLdb-fel:OperationalError:(1054, okänd kolumn i 'where-sats')

Använd inte "stränginjektion" i din SQL förutom i fall där det verkligen är oumbärligt, såsom str(DEPT) här för att välja vilket bord du väljer från. För alla andra fall, använd parametergenomsläppningsfunktionen i Python DB API istället -- den kommer att citera saker ordentligt åt dig och automatiskt försvara dig mot "SQL-injektion"-attacker, bland annat. (Det kan också vara snabbare ibland).

Eftersom MySQLdb använder den olyckliga notationen %s för parametrar, här är vad du bör göra (även fixa stilen så att den är PEP8-kompatibel, inte obligatorisk men kan inte skada;-):

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

%% s i strängformateringen som producerar q bli en enda % var och en vid formatering, så q finns kvar med två förekomster av %s -- som execute fyller i prydligt med korrekt formaterade versioner av CLASS och SEC . Alla str samtal är redundanta, etc.

För övrigt, om du använder Python 2.6 eller senare, för strängformatering bör du använda det nya format metoden istället för den gamla % operatör -- som besparar dig från behovet av dessa "fördubblade %-tecken", bland andra fördelar. Jag har inte tillämpat den ändringen i kodavsnittet ovan bara ifall du har fastnat med 2.5 eller tidigare (så koden ovan fungerar i alla versioner av Python, istället för bara i ganska nyare).



  1. Uppdatera tidsstämpelkolumnen i applikation eller databas?

  2. MySQL-index för Group By / Order By

  3. Hur man kopierar en tabell från en mysql-databas till en annan mysql-databas

  4. Fatalt fel:Anrop till odefinierad funktion mysqli_result()