11

MySQLサイトからダウンロードしたmysqlconnector.Python1.0.9を使用しています。

ここにサンプルテーブルがあります

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

今、私はエラー/トレースバックを取得しません。しかし、データベースは更新されていません。

誰かが私が間違っているところを教えてもらえますか?

4

4 に答える 4

31

ついに、ドキュメントとヘルプに関する長い調査の後。私は問題を解決することができました。

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()
于 2013-03-08T09:55:02.220 に答える
2

MySQLドキュメントを見る

multiがTrueに設定されている場合、execute()は操作文字列で指定された複数のステートメントを実行できます。各ステートメントの結果を処理できるようにするイテレータを返します。ただし、この場合、パラメーターの使用はうまく機能しません。通常、各ステートメントを単独で実行することをお勧めします。

したがって、multi = Trueを設定するとイテレータが返され、各ステートメントをループするだけの場合は、提供されている他のソリューションが適切に機能します。

for result in cursor.execute(SQL, multi=True):
    pass
于 2016-06-30T14:44:58.757 に答える
0

なんらかのコミットが必要です

cnx.commit()

MySQLリファレンス

于 2013-03-08T07:12:55.603 に答える
-1

別のオプションは、次のようにexecutemanyを使用することです。

sql=('insert into articulos (descripcion, precio) values(%s,%s)')  
data=[('naranjas',22), ("pomelos", 29), ("frutillas", 130)]

cursor.executemany(sql,data) 
于 2020-12-08T02:00:28.843 に答える