内容简介:http://stackoverflow.com/questions/4707957/ways-to-avoid-mysqldbs-commands-out-of-sync-you-cant-run-this-command-now
以下代码,使用 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次,之后没有).我应该朝这个方向发展吗?我的意思是,我应该明白这些集合的概念,找到解决我的问题吗?
DB-API尝试自行处理事务,在第一个命令上启动一个事务,并有自己的API调用来提交它,所以:
cursor.execute( "CREATE TABLE t1 ( t1_id INT PRIMARY KEY AUTO_INCREMENT )" ) cursor.commit() cursor.execute( "CREATE TABLE t2 ( t2_id INT PRIMARY KEY AUTO_INCREMENT )" ) cursor.commit()
在我看来,这是Python的DB-API的严重的设计错误,使得在事务之外执行命令并对事务进行适当的控制是一个严重的麻烦,例如.使用像 SQLite 的BEGIN EXCLUSIVE TRANSACTION这样的东西.就好像没有真正数据库经验的人被允许设计API …
http://stackoverflow.com/questions/4707957/ways-to-avoid-mysqldbs-commands-out-of-sync-you-cant-run-this-command-now
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Undo构造一致性读的例外情况
- 每个人的宿命都是从文本走向二进制,你也不例外 !
- 在 ASP.NET Core 中使用 Middleware 全域處理例外
- composer更新命令及常用命令
- Linux命令行与命令
- AWK命令和SED命令
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。