我正在使用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一起使用。

附言我知道MS SQL具有自动参数化的功能,该功能可用于基本查询,但不能保证,也可能不适用于复杂查询。

最佳答案

您正在正确使用pymssql。确实,在将查询发送到服务器之前,pymssql实际上确实将参数值替换为SQL文本。例如:

pymssql:



SELECT * FROM tablename WHERE id=1


带有Microsoft SQL Server ODBC驱动程序(不是FreeTDS ODBC驱动程序)的pyodbc:

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


但是,请记住pymssql是基于FreeTDS的,并且上述行为似乎是FreeTDS处理参数化查询的方式的功能,而不是pymssql本身的特定功能。

是的,这可能会影响执行计划的重用(进而影响性能),如this answer中所示。

关于python - pymssql库中是否正确实现了参数绑定(bind)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43980305/

10-13 09:20