python – 避免MySQLdb的“命令不同步的方法”你現在不能執行這個命令“(2014)例外
以下程式碼,使用python 2.6.6和SQL/">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