read mysqldb libreria from example python sql

mysqldb - read mysql python



¿Cómo usar variables en la declaración de SQL en Python? (4)

Ok, no soy tan experimentado 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 que python los incluya como parte del texto de la consulta?


Las diferentes implementaciones de Python DB-API pueden usar marcadores de posición diferentes, por lo que deberá averiguar cuál utiliza, 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 todavía (después de VALUES que podría tener (:1, :2, :3) o "estilos nombrados" (:fee, :fie, :fo) o (%(fee)s, %(fie)s, %(fo)s) donde pasa un dict en lugar de un mapa como segundo argumento para execute ). Compruebe la constante de cadena paramstyle en el módulo DB API que está utilizando, y busque paramstyle en 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 código real, está abierto a ataques .

Aquí copie y pegue 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 necesita:

# 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 añada valores de variables a sus declaraciones: Imagine que un usuario se nombra a sí mismo '';DROP TABLE Users;'' - Es por eso que necesita usar sql escaping, 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) )


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 API de la base de datos realiza el escapado correcto y cita de variables. Tenga cuidado de no utilizar el operador de formato de cadenas ( % ), porque

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