2013-03-08 11 views
8

Używam mysql connector.Python 1.0.9 pobranego ze strony MySQL.Zaktualizuj bazę danych z wieloma instrukcjami SQL

Mam próbkę 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'); 

Jestem w stanie wykonać jeden SQL statment jak poniżej.

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) 

i wszystko jest w porządku, a baza danych jest poprawnie aktualizowana.

teraz gdy próbuję zaktualizować bazę danych z wielu instrukcji jak poniżej

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

otrzymuję poniżej błędu 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 

zaktualizować polecenia jak poniżej

cursor.execute(SQL,multi = True) 

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

Teraz nie dostaję żadnego błędu/Traceback. Ale baza danych nie jest aktualizowana.

Czy ktoś może mi powiedzieć, gdzie robię źle.

Odpowiedz

23

at-ostatni po długim badań dokumentacji i pomocy. Mogłem rozwiązać problem.

Przy użyciu pętli for przy cursor.execute z multi=True działa. Nie wiem, dlaczego musimy przechodzić.

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

Bez pętli tylko cursor.execute(SQL, multi=True) nie dokonał żadnych zmian w bazie danych.

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

Dziękuję! Spędziłem godziny próbując zrozumieć, dlaczego to nie działa. – joel3000

+0

Byłoby świetnie, gdyby guru mysql.connector mógł _wyjaśnić_, dlaczego pętla for jest konieczna. – user1717828

0

Czy tęsknisz somekind popełnić

cnx.commit() 

MySQL reference

+0

, mam 'cnx.commit()' zrobiłem nie pisz w moim pytaniu. Mam zaktualizowane moje pytanie z 'cnx.commit()' – Rao

2

Patrząc na docs MySQL

Jeśli Multi jest ustawiona na True, execute() jest w stanie wykonać wiele instrukcji podanych w ciąg operacji. Zwraca iterator, który umożliwia przetwarzanie wyniku każdej instrukcji. Jednak używanie parametrów nie działa dobrze w tym przypadku i zwykle dobrym pomysłem jest samodzielne wykonanie każdej instrukcji.

tak zaprogramowana = true zwraca iterator i jeśli chcesz po prostu pętli każdym oświadczeniu inne rozwiązanie oferowane prace dobrze:

for result in cursor.execute(SQL, multi=True): 
    pass 
Powiązane problemy