47 votes

Python prend-il en charge les instructions préparées par MySQL?

J'ai déjà travaillé sur un projet PHP où des instructions préparées accéléraient les requêtes SELECT de 20%.

Je me demande si cela fonctionne sur Python? Je n'arrive pas à trouver quoi que ce soit qui dit spécifiquement qu'il fait ou ne fait PAS.

57voto

joshperry Points 17727

La plupart des langages permettent de le faire générique des instructions paramétrées, Python n'est pas différent. Lorsqu'une requête paramétrée est utilisé les bases de données qui prennent en charge la préparation des états financiers devront le faire automatiquement.

En python une requête paramétrée ressemble à ceci:

cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])

Le style spécifique de paramétrage peut être différent en fonction de votre pilote, vous pouvez importer votre base de données module, puis faire un print yourmodule.paramstyle.

À partir du 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'

13voto

James McMahon Points 14356

Réponse directe, non, il ne le fait pas.

joshperry la réponse est une bonne explication de ce qu'il fait à la place.

De eugene y répondre à une question similaire,

De vérifier la MySQLdb Paquet de Commentaires:

"Paramétrage" se fait dans MySQLdb par la fuite des cordes et ensuite aveuglément interpolation dans la requête, au lieu de l'aide de l' MYSQL_STMT API. Suite à des chaînes unicode avoir à passer par les deux les représentations intermédiaires (chaîne codée, a échappé à la chaîne codée) avant qu'ils ne soient reçus par la base de données.

La réponse est donc: Non, il ne le fait pas.

10voto

shylent Points 4590

Après un rapide coup d'œil à travers une méthode execute() d'un objet Curseur de MySQLdb paquet (une sorte de facto package pour l'intégration avec mysql, je suppose), il semble que (au moins par défaut) il ne chaîne d'interpolation et de cotation et non pas par les paramétrés de la requête:

if args is not None:
    query = query % db.literal(args)

Si ce n'est pas de la chaîne d'interpolation, alors c'est quoi?

En cas de executemany il réellement essaie d'exécuter l'insertion/remplacement, comme une seule instruction, par opposition à l'exécution en boucle. C'est à ce sujet, pas de magie, il semble qu'il. Au moins pas dans son comportement par défaut.

EDIT: Ah, je viens de réaliser, que l'opérateur modulo pourrait être surchargée, mais j'ai ressenti comme de la tricherie, et grepped la source. Ne pas trouver un surchargée mod n'importe où, cependant.

8voto

Amit Points 5760

Même si ce n'est pas le cas, vous pouvez utiliser l'interface SQL, documentée ici

5voto

user304386 Points 51

L'utilisation de l'interface SQL, comme suggéré par Amit, peut fonctionner si vous ne vous souciez que des performances. Cependant, vous perdez alors la protection contre l'injection SQL qu'un support natif Python pour des instructions préparées pourrait apporter. Python 3 contient des modules qui fournissent un support d'instructions préparées pour PostgreSQL. Pour MySQL, "oursql" semble fournir un vrai support pour les instructions préparées (non falsifié comme dans les autres modules).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X