我正在使用从MySQL站点下载的mysql connector.Python 1.0.9。
我有一个示例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语句。
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()
现在我没有得到任何错误/回溯。但是数据库没有得到更新。
任何人都可以告诉我我在哪里做错了。
答案 0 :(得分:25)
经过长时间的文档和帮助研究后。我能够解决这个问题。
在for
cursor.execute
循环使用multi=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()
答案 1 :(得分:2)
查看MySQL文档
如果multi设置为True,则execute()能够执行操作字符串中指定的多个语句。它返回一个迭代器,用于处理每个语句的结果。但是,在这种情况下使用参数不能很好地工作,并且通常自己执行每个语句通常是个好主意。
所以设置multi = True会返回一个迭代器,如果你只想循环遍历每个语句,那么提供的另一个解决方案效果很好:
for result in cursor.execute(SQL, multi=True):
pass
答案 2 :(得分:0)
答案 3 :(得分:0)
另一种选择是使用executemany,如下所示:
sql=('insert into articulos (descripcion, precio) values(%s,%s)')
data=[('naranjas',22), ("pomelos", 29), ("frutillas", 130)]
cursor.executemany(sql,data)