2013-03-08 33 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