web-dev-qa-db-ja.com

PyMysqlUPDATEクエリ

私は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はそれで機能します)

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

12
Shay

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

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

18
Joe Day

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

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

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

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

import pymysql

connection = pymysql.connect(autocommit=True)

私もそれについて書いています ここ いくつかの参照があります。

14
saaj