¿Cómo usar variables en la statement SQL en Python?

Ok, entonces no tengo tanta experiencia en Python.

Tengo el siguiente código de Python:

cursor.execute("INSERT INTO table VALUES var1, var2, var3,") 

donde var1 es un entero, var2 y var3 son cadenas.

¿Cómo puedo escribir los nombres de las variables sin python incluyéndolos como parte del texto de la consulta?

 cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3)) 

Tenga en cuenta que los parámetros se pasan como una tupla.

La base de datos API realiza el escape y la cita de las variables. Tenga cuidado de no utilizar el operador de formato de cadena ( % ), porque

  1. No hace ningún escape o cita.
  2. es propenso a ataques de formato de cadena incontrolada, por ejemplo, inyección SQL .

Se permite que diferentes implementaciones de la DB-API de Python utilicen diferentes marcadores de posición, por lo que tendrá que averiguar cuál está utilizando. Podría ser (por ejemplo, con MySQLdb):

 cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3)) 

o (por ejemplo, con sqlite3 de la biblioteca estándar de Python):

 cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3)) 

u otros aún (después de VALUES , podría tener (:1, :2, :3) , o “estilos con nombre” (:fee, :fie, :fo) o (%(fee)s, %(fie)s, %(fo)s) donde pasa un dict en lugar de un mapa como el segundo argumento a execute ). Verifique la constante de cadena de paramstyle en el módulo DB DB que está utilizando, y busque paramstyle en http://www.python.org/dev/peps/pep-0249/ para ver cuáles son todos los estilos de paso de parámetros.

Muchas maneras. NO use el más obvio ( %s con % ) en el código real, está abierto a ataques .

Aquí copiar y pegar desde pydoc de sqlite3 :

 # Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) print c.fetchone() # Larger example that inserts many records at a time purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ] c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases) 

Más ejemplos si necesitas:

 # Multiple values single statement/execution c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO')) print c.fetchall() c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO')) print c.fetchall() # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice. c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO') print c.fetchall() # Insert a single item c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00)) 

http://www.amk.ca/python/writing/DB-API.html

Tenga cuidado cuando simplemente agregue valores de variables a sus declaraciones: Imagine que un usuario se denomina a sí mismo ';DROP TABLE Users;' – Es por eso que necesita usar sql escape, que Python le proporciona cuando usa el cursor.execute de una manera decente. Ejemplo en la url es:

 cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid) )