Pregunta

Me estoy volviendo loco con MySQLdb !Estoy siguiendo exactamente el oficial doc pero tengo un error con el código :

DB_TABLE = "test"
cursor.execute("SELECT MAX(id) AS maxid FROM " + DB_TABLE)
print "***"
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , (DB_TABLE,))

Obtengo el error :

Traceback (most recent call last):
  File "dbscript.py", line 49, in <module>
    cursor.execute("SELECT MAX(id) AS maxid FROM %s" , (DB_TABLE,))
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/cursors.py", line 174, in execute
  File "build/bdist.macosx-10.7-intel/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test'' at line 1")

Obviamente hay un problema con algunas de las citas.Mi comando parece enviar una línea como esta para MySQL :

SELECT MAX(id) AS maxid FROM ''test''

¿Cómo puedo cambiar el doble de la oferta por uno solo ?

I v trató de las siguientes :

DB_TABLE = 'test'
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , [DB_TABLE])
cursor.execute("SELECT MAX(id) AS maxid FROM %s" , ("test",))

Pero nada funciona :(

¿Fue útil?

Solución

cursor.execute("SELECT MAX(id) AS maxid FROM %s" , ("test",)) 

y en declaraciones similares, el cursor.execute sustituye los parámetros SQL en %s.

Lo que necesitas es algo como esto

sql = "SELECT MAX(id) AS maxid FROM %s" % ("test", )
cursor.execute(sql)

Otros consejos

No se puede parametrizar el nombre de la tabla, por lo que debe desinfectarlo usted mismo y usar la sustitución de cadenas en la consulta en su lugar.

a saneitize un nombre de tabla en una consulta con múltiples parámetros:

query = "SELECT * FROM %s WHERE columnName = %s" % (tableName,'%s')
print(query)

En este punto, la consulta se mostrará como:

SELECT * FROM tableName WHERE columName = %s

Una vez que haya construido su cursor, use la condición parametrizada:

cursor.execute(query,(columnValue,))

La consulta real que MySQL leerá entonces es:

SELECT * FROM tableName WHERE columnName = columnValue

Si intenta pasar en un nombre de tabla sin desinfectarlo, obtendrá un error de sintaxis.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top