gpt4 book ai didi

python - pymssql 库中是否正确实现了参数绑定(bind)?

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:41 24 4
gpt4 key购买 nike

我正在使用 pymsqsql 库从 Python 程序调用极其简单的查询。

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

请注意,参数绑定(bind)的使用如 pymssql documentation 中所述。 .

参数绑定(bind)的主要目标之一是为 DBMS 引擎提供缓存查询计划的能力。我使用 Profiler 连接到 MS SQL 并检查实际执行了哪些查询。事实证明,每次执行一个唯一的语句(使用它自己的绑定(bind) 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# 查询时的参数绑定(bind)有很大不同,当我们可以看到查询相同但提供的参数不同时。

所以我想知道我是否正确使用了 pymssql 以及这个库是否适合与 MS SQL DBMS 一起使用。

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

最佳答案

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

pymssql:

SELECT * FROM tablename WHERE id=1

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

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

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

是的,如 this answer 所示,它会对执行计划的重用(以及性能)产生影响。 .

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com