La binding de parameters est-elle correctement implémentée dans la bibliothèque pymssql?

J'appelle la requête extrêmement simple du programme de Python utilisant la bibliothèque de pymsqsql.

with self.conn.cursor() as cursor: cursor.execute('select extra_id from mytable where id = %d', id) extra_id = cursor.fetchone()[0] 

Notez que la binding de parameters est utilisée comme décrit dans la documentation pymssql .

L'un des principaux objectives de la binding de parameters est de permettre au moteur de SGBD de mettre en cache le plan de requête. Je me suis connecté à MS SQL avec Profiler et vérifié quelles requêtes sont réellement exécutées. Il s'est avéré que chaque fois qu'une instruction unique est exécutée (avec son propre ID lié). J'ai également vérifié l'utilisation de la requête avec une telle requête:

 select * from sys.dm_exec_cached_plans ec cross apply sys.dm_exec_sql_text(ec.plan_handle) txt where txt.text like '%select extra_id from mytable where id%' 

Et il a montré que le plan n'est pas réutilisé (ce qui est prévisible bien sûr en raison du text unique de chaque requête). Cela diffère beaucoup de la binding de parameters lors d'une requête à partir de C #, quand nous pouvons voir que les requêtes sont les mêmes mais les parameters fournis sont différents.

Donc, je me request si j'utilise pymssql correctement et si cette lib est appropriée pour l'utilisation avec MS SQL DBMS.

PS Je sais que MS SQL dispose d'une fonctionnalité de paramétrage automatique qui fonctionne pour les requêtes de base, mais elle n'est pas garantie et peut ne pas fonctionner pour les requêtes complexes.

Vous utilisez pymssql correctement. Il est vrai que pymssql substitue effectivement les valeurs des parameters dans le text SQL avant d'envoyer la requête au server. Par exemple:

pymssql:

 SELECT * FROM tablename WHERE id=1 

pyodbc avec le pilote ODBC de Microsoft pour SQL Server (pas le pilote FreeTDS ODBC):

 exec sp_prepexec @p1 output,N'@P1 int',N'SELECT * FROM tablename WHERE id=@P1',1 

Cependant, gardez à l'esprit que pymssql est basé sur FreeTDS et que le comportement ci-dessus semble être fonction de la façon dont FreeTDS gère les requêtes paramétrées, plutôt qu'une caractéristique spécifique de pymssql en soi .

Et oui, cela peut avoir des implications pour la réutilisation des plans d'exécution (et donc des performances) comme illustré dans cette réponse .