query - python mysql insert
¿Admite Python las declaraciones preparadas de MySQL? (7)
Trabajé en un proyecto de PHP anteriormente, donde las declaraciones preparadas hicieron que las consultas SELECT fueran un 20% más rápidas.
Me pregunto si funciona en Python. Parece que no puedo encontrar nada que específicamente diga o no.
¡Hay una solucion!
Puede usarlos si los pone en un procedimiento almacenado en el servidor y los llama así desde python ...
cursor.callproc(Procedurename, args)
Aquí hay un pequeño y agradable tutorial sobre procedimientos almacenados en mysql y python.
http://www.mysqltutorial.org/calling-mysql-stored-procedures-python/
Después de echar un vistazo rápido a un método execute () de un objeto Cursor de un paquete MySQLdb (un tipo de paquete de facto para integrar con mysql, supongo), parece que (al menos de manera predeterminada) solo interpola las cadenas y citando y no la consulta parametrizada real:
if args is not None:
query = query % db.literal(args)
Si esto no es interpolación de cadenas, ¿qué es?
En caso de ejecutar Many, realmente intenta ejecutar la inserción / reemplazo como una declaración única, en lugar de ejecutarla en un bucle. Eso es todo, no hay magia allí, parece. Al menos no en su comportamiento predeterminado.
EDITAR: Ah, me acabo de dar cuenta de que el operador del módulo podría ser anulado, pero he tenido ganas de hacer trampa y haber agotado la fuente. Sin embargo, no encontré un mod
ninguna parte.
La mayoría de los lenguajes proporcionan una forma de hacer declaraciones con parámetros genéricos, Python no es diferente. Cuando se usa una consulta parametrizada, las bases de datos que soportan la preparación de declaraciones lo harán automáticamente.
En python, una consulta parametrizada tiene el siguiente aspecto:
cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
El estilo específico de parametrización puede ser diferente dependiendo de su controlador, puede importar su módulo db y luego print yourmodule.paramstyle
.
De PEP-249 :
paramstyle
String constant stating the type of parameter marker formatting expected by the interface. Possible values are [2]: ''qmark'' Question mark style, e.g. ''...WHERE name=?'' ''numeric'' Numeric, positional style, e.g. ''...WHERE name=:1'' ''named'' Named style, e.g. ''...WHERE name=:name'' ''format'' ANSI C printf format codes, e.g. ''...WHERE name=%s'' ''pyformat'' Python extended format codes, e.g. ''...WHERE name=%(name)s''
No relacionado directamente, pero esta respuesta a otra pregunta en SO incluye los detalles de sintaxis de las consultas ''con plantilla''. Yo diría que el auto-escape sería su característica más importante ...
En cuanto a rendimiento, observe el método executemany
en los objetos de cursor. Agrupa una serie de consultas y las ejecuta de una sola vez, lo que conduce a un mejor rendimiento.
Para las personas que intentan resolver esto, SÍ , puede usar declaraciones preparadas con Python y MySQL. Simplemente use MySQL Connector / Python desde MySQL y crea una instancia del cursor derecho:
https://dev.mysql.com/doc/connector-python/en/index.html
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursorprepared.html
Usar la interfaz SQL como lo sugiere Amit puede funcionar si solo le preocupa el rendimiento. Sin embargo, luego pierde la protección contra la inyección de SQL que podría brindar una compatibilidad nativa con Python para las declaraciones preparadas. Python 3 tiene módulos que proporcionan soporte de declaraciones preparadas para PostgreSQL. Para MySQL, "oursql" parece proporcionar verdadero soporte de declaraciones preparado (no falsificado como en los otros módulos).
Respuesta directa, no, no.
La respuesta de joshperry es una buena explicación de lo que hace en su lugar.
Desde eugene y respuesta a una pregunta similar ,
Compruebe los comentarios del paquete MySQLdb:
La "parametrización" se realiza en MySQLdb escapando cadenas y luego interpolando ciegamente en la consulta, en lugar de usar la API MYSQL_STMT. Como resultado, las cadenas unicode deben pasar por dos representaciones intermedias (cadena codificada, cadena codificada escapada) antes de ser recibidas por la base de datos.
Entonces la respuesta es: No, no es así.