Mysql
 sql >> Base de données >  >> RDS >> Mysql

Erreur Python et mySQLdb :OperationalError :(1054, colonne inconnue dans 'where clause')

N'utilisez pas "l'injection de chaîne" dans votre SQL, sauf dans les cas où c'est vraiment indispensable, comme le str(DEPT) ici pour choisir la table à partir de laquelle vous sélectionnez. Pour tous les autres cas, utilisez plutôt la fonction de transmission de paramètres de l'API Python DB - elle citera les choses correctement pour vous et vous défendra automatiquement contre les attaques par "injection SQL", entre autres. (Cela peut aussi être plus rapide, parfois).

Étant donné que MySQLdb utilise la notation malheureuse %s pour les paramètres, voici ce que vous devez faire (également en fixant le style pour qu'il soit conforme à la PEP8, ce n'est pas obligatoire mais ça ne peut pas faire de mal ;-) :

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

Le %% s dans le formatage de chaîne qui produit q devenir un seul % chacun lors du formatage, donc q reste avec deux occurrences de %s -- que le execute se remplit proprement avec les versions correctement formatées de CLASS et SEC . Tous les str les appels sont redondants, etc.

En passant, si vous utilisez Python 2.6 ou une version ultérieure, pour le formatage des chaînes, vous devez utiliser le nouveau format méthode au lieu de l'ancien % opérateur - cela vous évite d'avoir besoin de ces "signes % doublés", entre autres avantages. Je n'ai pas appliqué ce changement dans l'extrait ci-dessus juste au cas où vous seriez coincé avec 2.5 ou une version antérieure (donc le code ci-dessus fonctionne dans n'importe quelle version de Python, au lieu de seulement dans les versions raisonnablement récentes).