sql >> Database >  >> RDS >> Mysql

Python- en mySQLdb-fout:OperationalError:(1054, onbekende kolom in 'where-clausule')

Gebruik geen "string-injectie" in uw SQL, behalve in gevallen waarin het echt onmisbaar is, zoals de str(DEPT) hier om te kiezen uit welke tafel u kiest. Gebruik voor alle andere gevallen de functie voor het doorgeven van parameters van de Python DB API -- het zal de zaken correct voor u citeren en u automatisch verdedigen tegen onder andere "SQL-injectie"-aanvallen. (Het kan soms ook sneller zijn).

Omdat MySQLdb de ongelukkige notatie %s gebruikt voor parameters, hier is wat je moet doen (ook de stijl aanpassen om PEP8-compatibel te zijn, niet vereist maar kan geen kwaad;-):

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

De %% s in de tekenreeksopmaak die q . oplevert word een enkele % elk bij het formatteren, dus q blijft over met twee exemplaren van %s -- die de execute wordt netjes ingevuld met correct opgemaakte versies van CLASS en SEC . Alle str oproepen zijn overbodig, enz.

Even terzijde, als je Python 2.6 of hoger gebruikt, moet je voor het formatteren van strings het nieuwe format gebruiken methode in plaats van de oude % operator -- dat bespaart u de noodzaak van die "verdubbelde %-tekens", naast andere voordelen. Ik heb die wijziging niet toegepast in het bovenstaande fragment voor het geval je vastzit aan 2.5 of eerder (dus de bovenstaande code werkt in elke versie van Python, in plaats van alleen in redelijk recente versies).



  1. PostgreSQL-fout bij het maken van een extensie

  2. JDBC geeft lege resultaatset terug

  3. APPLSYSPUB-schema

  4. SQL-query met binaire gegevens (PHP en MySQL)