40

MySQLデータベースの行を更新するのに問題があります。これが私が実行しようとしているコードです:

import MySQLdb

conn=MySQLdb.connect(host="localhost", user="root", passwd="pass", db="dbname")
cursor=conn.cursor()

cursor.execute("UPDATE compinfo SET Co_num=4 WHERE ID=100")
cursor.execute("SELECT Co_num FROM compinfo WHERE ID=100")
results = cursor.fetchall()

for row in results:
    print row[0]

print "Number of rows updated: %d" % cursor.rowcount

cursor.close()
conn.close()

このプログラムを実行したときに得られる出力は次のとおりです。

4
更新された行数:1

動作しているように見えますが、MySQLコマンドラインインターフェイス(CLI)からデータベースをクエリすると、データベースがまったく更新されていないことがわかります。ただし、CLIから入力するUPDATE compinfo SET Co_num=4 WHERE ID=100;と、データベースは期待どおりに更新されます。

私の問題は何ですか?WindowsボックスでMySQL5.1.30を使用してPython2.5.2を実行しています。

4

6 に答える 6

66

確かではありませんが、INNODBテーブルを使用していて、コミットを行っていないことを推測します。MySQLdbはトランザクションを自動的に有効にすると思います。

呼び出すconn.commit()前に呼び出しcloseます。

FAQから: 1.2.0以降、MySQLdbはデフォルトで自動コミットを無効にします

于 2008-12-21T08:08:32.143 に答える
31

MySQLdb はデフォルトで自動コミットがオフになっているため、最初は混乱するかもしれません。接続は独自のトランザクションに存在し、そのトランザクションをコミットするまで、他の接続から行った変更を確認することはできません。

conn.commit()他の人が指摘したように更新ステートメントの後に行うかconn.autocommit(True)、接続オブジェクトを作成した直後に設定してこの機能を完全に無効にすることができます。

于 2008-12-21T13:19:16.930 に答える
8

変更を手動でコミットするか、自動コミットをオンにする必要があります。

SELECT が変更された (ただし永続化されていない) データを返す理由は、接続がまだ同じトランザクション内にあるためです。

于 2008-12-21T10:11:28.790 に答える
2

Pythonのコネクタが自動的に自動コミットをオフにしていることがわかりましたが、この動作を変更する方法はないようです。もちろん、オンに戻すこともできますが、クエリログを見ると、接続後に2つの無意味なクエリを実行して、自動コミットをオフにしてからオンに戻します。

于 2008-12-21T10:53:43.573 に答える