我使用pymsqsql库从Python程序调用非常简单的查询。
with self.conn.cursor() as cursor:
cursor.execute('select extra_id from mytable where id = %d', id)
extra_id = cursor.fetchone()[0]
请注意,参数绑定的使用方法如pymssql documentation。
中所述参数绑定的主要目标之一是为DBMS引擎提供缓存查询计划的能力。我使用Profiler连接到MS SQL并检查了实际执行的查询。事实证明,每次执行一个唯一的语句(具有自己的绑定ID)。我还用这样的查询检查了查询用法:
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%'
它表明该计划没有被重用(当然,由于每个查询的唯一文本,这是可以预期的)。当从C#查询时,这与参数绑定有很大不同,当我们可以看到查询相同但提供的参数不同时。
所以我想知道我是否正确使用pymssql以及这个lib是否适合与MS SQL DBMS一起使用。
P.S。我知道MS SQL具有自动参数化功能,适用于基本查询,但不保证,并且可能不适用于复杂查询。
答案 0 :(得分:2)
您正在使用pymssql。确实,在将查询发送到服务器之前,pymssql实际上确实将参数值替换为SQL文本。例如:
pymssql:
SELECT * FROM tablename WHERE id=1
pyodbc与Microsoft的SQL Server ODBC驱动程序(不是FreeTDS ODBC驱动程序):
exec sp_prepexec @p1 output,N'@P1 int',N'SELECT * FROM tablename WHERE id=@P1',1
但是,请记住pymssql基于FreeTDS,上述行为似乎是FreeTDS处理参数化查询的方式的函数,而不是pymssql 本身的特定功能。
是的,它可能会影响执行计划的重复使用(以及性能),如this answer所示。