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
- no hace ningún escape o cita.
- es propenso a ataques de formato de cadena no controlados, por ejemplo, inyección de SQL .