【发布时间】:2011-06-10 03:03:09
【问题描述】:
以下代码,使用 python 2.6.6 和 MySQLdb 1.2.2 导致 命令不同步;您现在无法运行此命令 MySQLdb 异常:
import MySQLdb
conn = MySQLdb.connect( db="test", user="root" )
cursor = conn.cursor( MySQLdb.cursors.DictCursor )
cursor.execute( "BEGIN; CREATE TABLE t1 ( t1_id INT PRIMARY KEY AUTO_INCREMENT ); COMMIT;" )
cursor.execute( "BEGIN; CREATE TABLE t2 ( t2_id INT PRIMARY KEY AUTO_INCREMENT ); COMMIT;" )
在执行第二个查询期间引发异常。正如我所读到的,该异常通常是由 MySQL 的 C API 实现的限制引起的,它不允许并发查询执行。
如果我在上述两个查询之间重新创建游标对象,问题就会得到解决,但不幸的是,该解决方案对我来说似乎并不完美。我对数据库连接和查询执行有一个非常简单的抽象,并且不希望在每次查询执行后重新创建游标,因为它会(据我了解)提交当前事务并可能产生其他副作用。
因此,我的问题是:还有哪些其他方法可以避免此异常?如何准备游标对象以执行下一个查询?也许Python DB API期望有一些方法,在使用其他数据库接口时会相对中立,在MySQLdb的情况下可以解决问题?
提前感谢您的时间和帮助:)
编辑: 发布问题后,我开始阅读 Python DB API 规范以了解游标破坏的副作用(我不再那么确定事务提交了 :)),我发现了以下替代解决方法:
cursor.execute( "BEGIN; CREATE TABLE t1 ( t1_id INT PRIMARY KEY AUTO_INCREMENT ); COMMIT;" )
while cursor.nextset() is not None: pass
cursor.execute( "BEGIN; CREATE TABLE t2 ( t2_id INT PRIMARY KEY AUTO_INCREMENT );
问题是我不知道它做了什么(它返回两次1,然后返回None)。我应该深入这个方向吗?我的意思是,我应该了解这些集合的概念以找到解决问题的方法吗?
【问题讨论】: