2013-03-08 51 views
8

我正在使用mysql connector.Python 1.0.9從MySQL網站下載。使用多個SQL語句更新數據庫

我有一個樣品table here

DROP TABLE IF EXISTS my_table; 
CREATE TABLE my_table 
(id INT NOT NULL AUTO_INCREMENT UNIQUE, 
Shot VARCHAR(4), 
sec varchar(5), 
lay VARCHAR(15) NOT NULL, 
lay_status VARCHAR(15) NOT NULL, 
blk VARCHAR(10) NOT NULL, 
blk_status VARCHAR(15) NOT NULL, 
pri VARCHAR(10) NOT NULL, 
pri_status VARCHAR(15) NOT NULL, 
ani VARCHAR(10) NOT NULL, 
ani_status VARCHAR(15) NOT NULL, 
status VARCHAR(5) 
); 

INSERT INTO my_table VALUES 
(1,'SH01','3','1863','yes','1863','yes','P4645','yes','P4557','yes','Over'), 
(2,'SH02','2.5','1863','yes','P4645','no','P4557','yes','1863','no','Over'), 
(3,'SH03','0.5','P4645','yes','P4557','yes','1863','yes','1863','yes','WIP'), 
(4,'SH04','1.25','1863','no','P4645','no','P4557','yes','1863','yes','RTK'), 
(5,'SH05','1','1863','yes','1863','yes','P4645','yes','P4557','yes','WIP'), 
(6,'SH06','6','P4557','yes','P4645','yes','P4645','yes','P4557','yes','WIP'); 

我能夠如下執行一個SQL statment。

import mysql.connector 

cnx = mysql.connector.connect(user='scott', database='test') 
cursor = cnx.cursor() 

SQL = ''' 
     update my_table 
     set 
     LAY = 'P6682' 
     , BLK = 'P6682' 
     , ANI = 'P6682' 
     where 
     Shot = 'SH01'; 
     ''' 

cursor.execute(SQL) 

和一切都很好,數據庫得到正確更新。

現在,當我試圖更新多條語句的數據庫如下

import mysql.connector 

cnx = mysql.connector.connect(user='scott', database='test') 
cursor = cnx.cursor() 

SQL = ''' 
    update my_table 
    set 
    LAY = 'P6682' 
    , BLK = 'P6682' 
    , ANI = 'P6682' 
    where 
    Shot = 'SH01'; 

    update my_table 
    set 
    LAY = '1863' 
    , BLK = '1863' 
    , ANI = '1863' 
    where 
    Shot = 'SH02' 
''' 

cursor.execute(SQL) 
cnx.commit() 
cur.close() 
cnx.close() 
cnx.disconnect() 

我得到下面引用錯誤

Traceback (most recent call last): 
    File "Test_Module.py", line 24, in 
    File "C:\Python26\Lib\site-packages\mysql\connector\cursor.py", line 396, in execute 
    "Use multi=True when executing multiple statements") 
InterfaceError: Use multi=True when executing multiple statements 

更新我的命令,如下

cursor.execute(SQL,multi = True) 

cnx.commit() 
cur.close() 
cnx.close() 
cnx.disconnect() 

現在我沒有得到任何錯誤/追蹤。但數據庫沒有得到更新。

任何人都可以告訴我我在哪裏做錯了。

回答

23

在-最後對文檔和幫助一個長期的研究後。我可以解決這個問題。

使用for循環在cursor.executemulti=True工作。我不知道爲什麼我們需要循環。

for result in cursor.execute(SQL, multi=True): 
    pass 

沒有循環只是cursor.execute(SQL, multi=True)沒有做任何數據庫更改。

import mysql.connector 

cnx = mysql.connector.connect(user='scott', database='test') 
cursor = cnx.cursor() 

SQL = ''' 
    update my_table 
    set 
    LAY = 'P6682' 
    , BLK = 'P6682' 
    , ANI = 'P6682' 
    where 
    Shot = 'SH01'; 

    update my_table 
    set 
    LAY = '1863' 
    , BLK = '1863' 
    , ANI = '1863' 
    where 
    Shot = 'SH02' 
''' 

for result in cursor.execute(SQL, multi=True): 
    pass 

cnx.commit() 
cur.close() 
cnx.close() 
cnx.disconnect() 
+3

謝謝!我花了數小時試圖弄清楚爲什麼這不起作用。 – joel3000 2015-11-22 07:05:23

+0

如果一個mysql.connector大師可以_explain_爲什麼需要for循環,那將會很棒。 – user1717828 2018-01-04 22:58:18

0

您忘somekind的而犯

cnx.commit() 

MySQL reference

+0

,我有'cnx.commit()'我做不寫在我的問題。我用'cnx.commit()'更新了我的問題' – Rao 2013-03-08 08:54:11

2

在MySQL的文檔尋找

如果多設置爲True,執行()能夠執行在操作字符串中指定多個語句。它返回一個迭代器,它可以處理每個語句的結果。但是,在這種情況下使用參數並不能很好地工作,並且通常是單獨執行每個語句的好主意。

所以設置多= true,則返回一個迭代器,如果你只是通過每個語句要循環,其他解決方案提供很好的作品:

for result in cursor.execute(SQL, multi=True): 
    pass