2013-03-08 19 views
8

Sto usando mysql connector.Python 1.0.9 scaricato dal sito MySQL.Aggiornamento del database con più SQL Statments

Ho un campione 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'); 

sono in grado di eseguire una singola statment SQL come di seguito.

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) 

e tutto è a posto e il database viene aggiornato correttamente.

ora quando sto cercando di aggiornare il database con più istruzioni, come di seguito

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

ottengo sotto l'errore 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 

aggiorno il mio comando, come di seguito

cursor.execute(SQL,multi = True) 

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

Ora non ottengo alcun errore/Traceback. Ma il database non viene aggiornato.

Qualcuno può dirmi dove sto sbagliando.

risposta

23

At-scorso, dopo una lunga ricerca sulla documentazione e aiuto. Potrei riuscire a risolvere il problema.

Utilizzo di un ciclo for a cursor.execute con multi=True lavorato. Non so perché dobbiamo attraversare.

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

Senza passante appena cursor.execute(SQL, multi=True) non ha fatto alcuna modifica nel database.

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

Grazie! Ho passato ore a cercare di capire perché non funzionava. – joel3000

+0

Sarebbe bello se un guru di mysql.connector potesse _explain_ perché è necessario il ciclo for. – user1717828

0

Hai perso la somekind di impegnarsi

cnx.commit() 

MySQL reference

+0

, ho 'cnx.commit()' ho fatto non scrivere nella mia domanda. ho aggiornato la mia domanda con 'cnx.commit()' – Rao

2

Guardando la documentazione MySQL

se a più è impostata su true, execute() è in grado di eseguire più istruzioni specificate nella stringa di funzionamento. Restituisce un iteratore che consente di elaborare il risultato di ogni istruzione. Tuttavia, l'uso dei parametri non funziona bene in questo caso, ed è generalmente una buona idea eseguire ciascuna istruzione da sola.

così l'impostazione di multi = true restituisce un iteratore e se si desidera solo per ciclo attraverso ogni dichiarazione, l'altra soluzione offerta funziona bene:

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