Me puede estar faltando algo obvio, pero no puedo entender cómo mi código es diferente de varios ejemplos que veo en la documentación en línea para MySQLdb.Python, MySQLdb y nombres de tabla de escape?
Soy bastante nuevo en la programación de python, más experimentado con perl. Lo que trato de hacer es adoptar ciertos buenos hábitos desde el principio (como en Perl, siempre empiezo con 'use strict, use warnings'), así que estoy tratando de asegurarme de crear funciones reutilizables en un archivo independiente (funct.py) para ahorrarme tiempo más adelante en la línea.
Tengo esta función para seleccionar al azar filas de una tabla:
def returnRandom(conn,countcol,table,field):
cursor = conn.cursor()
cursor.execute('SELECT MAX(%s) FROM %s',(countcol,table))
maxRow = cursor.fetchone()[0]
cursor.execute("SELECT MIN(%s) FROM %s",(countcol,table))
minRow = cursor.fetchone()[0]
randomId = random.randrange(minRow,maxRow+1,1)
cursor.execute("SELECT ? FROM ? WHERE id >=? LIMIT 1",field,table,randomId)
return cursor.fetchone()[0]
Se trata de ser llamado como esto:
msg = funct.returnRandom(conn,"id","testtable","data")
Por desgracia, los errores hacia fuera con: _mysql_exceptions.ProgrammingError: (1064, "Tiene un error en la sintaxis de SQL, consulte el manual que corresponde a su versión de servidor MySQL para la sintaxis correcta para usar cerca de '' testtable '' en la línea 1")
Si pongo en TestTable en lugar del% s en la línea de ejecución, la consulta se ejecutará, pero parece que se ejecuta
SELECT MAX('id') FROM testtable;
cuál de 'id' del curso devoluciones.
Dado que parece que está citando las entradas% s cuando intenta ejecutarlas. Me preguntaba si alguien podría explicar cómo lo hago para dejar de hacer eso, o cómo debería estar haciendo lo que estoy tratando de lograr. Quiero que la función sea lo más genérica posible, de modo que confíe en los datos que se le envían cuando se la llama.
editar: Debo agregar, si lo sustituyo? marcas:
....
cursor.execute('SELECT MAX(?) FROM ?',(countcol,table))
File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 151, in execute
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
Eso es lo ideal de lo que estoy tratando de evitar. Ya he logrado una función de formato de uso similar, pero me gustaría hacerlo un poco más seguro. – Twirrim