Actualizar la base de datos con múltiples declaraciones SQL

Estoy usando mysql connector.Python 1.0.9 descargado del sitio MySQL.

Tengo una mesa de muestra aquí

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'); 

soy capaz de ejecutar una sola statement SQL como a continuación.

 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) 

y todo está bien y la base de datos se actualiza correctamente.

Ahora, cuando estoy tratando de actualizar la base de datos con varias declaraciones como a continuación

 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() 

Me sale por debajo del error de trackback

 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 

Actualizo mi comando como abajo

 cursor.execute(SQL,multi = True) cnx.commit() cur.close() cnx.close() cnx.disconnect() 

Ahora no tengo ningún error / Traceback. Pero la base de datos no se está actualizando.

¿Alguien puede decirme dónde estoy haciendo mal?

Por fin después de una larga investigación en documentos y ayuda. Pude resolver el problema.

Usando un bucle for en cursor.execute con multi=True trabajado. No sé por qué tenemos que pasar.

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

Sin el bucle, solo cursor.execute(SQL, multi=True) no hizo ningún cambio en la base de datos.

 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() 

Mirando los documentos de MySQL

Si multi se establece en True, execute () puede ejecutar varias instrucciones especificadas en la cadena de operación. Devuelve un iterador que permite procesar el resultado de cada instrucción. Sin embargo, el uso de parámetros no funciona bien en este caso, y por lo general es una buena idea ejecutar cada statement por sí sola.

por lo tanto, establecer multi = True devuelve un iterador y si solo desea recorrer cada instrucción, la otra solución ofrecida funciona bien:

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

¿Echas de menos a algún tipo de cometer?

 cnx.commit() 

Referencia de MySQL