我可以在 pyodbc 和 MS SQL Server 的一个连接上使用多个游标吗?
我在 python 2.6 上使用 pyodbc 连接到 Microsoft SQL Server 2005。我打开一个连接,创建几个游标:
c1 = connection.cursor()
c2 = connection.cursor()
然后在第一个游标上运行查询。
c1.execute("select * from foo")
现在我在第二个游标上运行查询:
c2.execute("select * from bar")
...并且收到错误:“连接正忙于处理另一个 hstmt 的结果。”
在执行 c1.fetchall()
或 c1.close()
后,我就可以使用 c2 了。
我的问题是:如果一次只允许使用一个游标,并且始终可以重复使用同一个游标,为什么我还可以在一个连接上创建多个游标?而且,如果我想对另一个查询结果的每一行运行一个查询,如下所示:
for x in c1.execute(...):
for y in c2.execute(...):
我真的必须创建与同一数据库的多个连接吗?
I'm using pyodbc on python 2.6 to connect to Microsoft SQL Server 2005. I open a connection, create a couple of cursors:
c1 = connection.cursor()
c2 = connection.cursor()
and then run a query on the first cursor.
c1.execute("select * from foo")
Now I run a query on the second cursor:
c2.execute("select * from bar")
...and I get an error: "Connection is busy with results for another hstmt."
After I do a c1.fetchall()
or c1.close()
then I can use c2.
My question is: Why am I even allowed to create multiple cursors on a connection, if I'm only allowed to use one at a time, and the same one can always be reused? And, if I want to run a query for each row of the results of another query, like this:
for x in c1.execute(...):
for y in c2.execute(...):
do I really have to create multiple connections to the same database?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
根据 这个人
您可以确定可以通过以下方式支持并发游标:
According to this guy
and you can determine concurrent cursors can be supported with:
这似乎是通过多线程支持的: http:// technet.microsoft.com/en-US/library/ms131700(v=sql.90).aspx
This appears to be supported via multithreading: http://technet.microsoft.com/en-US/library/ms131700(v=sql.90).aspx
根据我自己的实践,我从未遇到过使用多个数据库游标的必要性。此类问题通常通过复杂的 SQL 查询(连接、分组)来解决。或者(如果可以忽略性能问题)使用几个简单的查询。
I my own practice I have never met necessity to use more than one database cursor. Such problems are used to be solved by sophisticated SQL queries (joins, groups). Or (if you can to ignore perfomance issues) by using several simple queries.