tutorial query mysqldb mysqlclient example consulta python mysql prepared-statement

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.



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.



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í.