sql >> Base de Datos >  >> RDS >> Mysql

Error de Python y mySQLdb:OperationalError:(1054, columna desconocida en 'cláusula where')

No use "inyección de cadenas" en su SQL, excepto en los casos en que sea realmente indispensable, como str(DEPT) aquí para elegir de qué mesa está seleccionando. Para todos los demás casos, utilice la función de paso de parámetros de la API de base de datos de Python; citará las cosas correctamente y lo defenderá automáticamente contra los ataques de "inyección de SQL", entre otras cosas. (También puede ser más rápido, a veces).

Dado que MySQLdb usa la desafortunada notación %s para los parámetros, esto es lo que debe hacer (también arreglar el estilo para que sea compatible con PEP8, no es necesario pero no puede dañar;-):

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

El %% s en el formato de cadena que produce q convertirse en un único % cada uno al formatear, así que q queda con dos ocurrencias de %s -- que el execute se completa perfectamente con las versiones correctamente formateadas de CLASS y SEC . Todos los str las llamadas son redundantes, etc.

Aparte, si está en Python 2.6 o posterior, para el formato de cadena debe usar el nuevo format método en lugar del antiguo % operador, que le ahorra la necesidad de esos "signos de % duplicados", entre otras ventajas. No apliqué ese cambio en el fragmento anterior en caso de que te quedes atascado con 2.5 o anterior (por lo que el código anterior funciona en cualquier versión de Python, en lugar de solo en las relativamente recientes).