16

私は PyMysql を使用しようとしてきましたが、これまでに行ったことはすべて機能しました (選択/挿入) が、更新しようとすると機能せず、エラーも何もせず、何もしません。

import pymysql
connection = pymysql.connect(...)
cursor = connection.cursor()
cursor.execute("UPDATE Users SET IsConnected='1' WHERE Username='test'")
cursor.close()
connection.close()

はい、Users、IsConnected、および Username がすべて正しく、テストが存在することを再確認しました (SELECT が機能します)。

ここで私の問題は何ですか?

4

2 に答える 2

25

更新を実行すると、MySQL は暗黙的にトランザクションを開始します。connection.commit()切断時にトランザクションが自動的にロールバックしないようにするには、更新を実行した後に呼び出して、このトランザクションをコミットする必要があります。

MySQL (少なくともテーブルに InnoDB エンジンを使用する場合) はトランザクションをサポートします。これにより、一連の update/insert ステートメントを実行してから、それらすべてを 1 つの操作として一度に効果的にコミットするか、ロールバックして何も適用されないようにすることができます。トランザクションを明示的にコミットしない場合、データベースへの接続を閉じると自動的にロールバックされます。

于 2013-07-20T02:47:09.730 に答える
21

実際、@JoeDay が上記で説明したことは、デフォルトの MySQL トランザクションの動作とはほとんど関係がありません。デフォルトでは、MySQL は自動コミット モードで動作し、通常、変更を永続化するために追加のひねりを加える必要はありません。

デフォルトでは、MySQL は自動コミット モードを有効にして実行されます。これは、テーブルを更新 (変更) するステートメントを実行するとすぐに、MySQL が更新をディスクに保存して永続的にすることを意味します。変更をロールバックすることはできません。

PEP-249 (DB API) の作成者は、自動コミットをデフォルトで無効にすることを提案することで、トランザクションの開始を暗黙的にすることで物事を複雑にし、Zen of Python を壊すことにしました。

私が提案するのは、MySQL のデフォルトの動作を復元することです。また、必要な場合にのみトランザクションを明示的に使用します。

import pymysql

connection = pymysql.connect(autocommit=True)

参考文献も含めてこちらにも書いています。

于 2016-02-25T08:13:04.493 に答える