2012-02-22 9 views
5

Necesito cambiar dinámicamente tablas y variables de vez en cuando, así que escribí un método pitón de esta manera:Python y MySQLdb: sustitución de tabla resultante de error de sintaxis

selectQ ="""SELECT * FROM %s WHERE %s = %s;""" 
    self.db.execute(selectQ,(self.table,self.columnSpecName,idKey,)) 
    return self.db.store_result() 

Sin embargo, esto da lugar a un error de sintaxis excepción. Intenté depurarlo, así que imprimí las variables en el método y las rellené manualmente, y funcionó. ¿Entonces no estoy seguro de lo que estoy haciendo mal?

¿Es porque trato de usar un sustituto para una tabla?

¿Cómo debo depurar mysqldb para que imprima la consulta sustituida como una cadena?

Respuesta

10

La sustitución de parámetros en la DB API es solo para valores, no tablas o campos. Tendrá que usar sustitución de cadenas normales para aquellos:

selectQ ="""SELECT * FROM %s WHERE %s = %%s;""" % (self.table,self.columnSpecName) 
self.db.execute(selectQ,(idKey,)) 
return self.db.store_result() 

Tenga en cuenta que el valor de marcador de posición tiene un doble % - esto es por lo que le deja solo por la sustitución inicial cadena.

+0

Si he entendido bien lo sustituirá por el% s con una cadena y que sólo va a dejar una % de signo de %% s? –

+0

Sí, eso es correcto. –

+0

muchas gracias :) –

-3

Quizás quiso decir al escribir:

selectQ = """SELECT * FROM %s WHERE %s = %s;""" % (self.table,self.columnSpecName,idKey) #maybe the idkey should be self.idkey? don't know the rest of the code 

self.db.execute(selectQ) 

y esto es sólo un error con el formato de cadenas?

Btw ¿por qué escribes SQL explícito para este tipo de trabajo? mejor uso mágico sqlalchemy para python sql manipulación ..

0

Tendrá que usar la sustitución de cadenas para agregar los nombres de tabla y columna, el controlador solo manejará los parámetros.

Ed: NM, Daniel habló más rápido y más completamente

1

Aquí es un ejemplo completo de trabajo

def rtnwkpr(tick, table, col): 

    import MySQLdb as mdb 
    tickwild = tick + '%'  
    try: 
     con = mdb.connect(host, user, password, db); 
     cur = con.cursor() 
     selectq = "SELECT price FROM %s WHERE %s LIKE %%s;" % (table, col) 
     cur.execute(selectq,(tickwild)) 
     return cur.fetchall()   
+0

def inswk (tabla, total, fecha, marca): importe MySQLdb como mdb import sys con = Ninguno try: con = mdb.connect (host, usuario, contraseña, db); cur = con.cursor() selectq = "" "INSERT INTO% s (precio, fecha, ticker) VALORES (%% s, %% s, %% s)" ""% (tabla) cur.execute (selectq, (total, fecha, tilde)) –

Cuestiones relacionadas