質問

私は、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マシン上でMySQL 5.1.30でのPython 2.5.2を実行しているよ。

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

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

接続は、同じトランザクションのままであるため、

SELECTを変更(ただし、永続しない)データを返す理由がある。

私は、Pythonのコネクタが自動的に自動コミットをオフにして、この動作を変更するにはどのような方法があるように表示されていないことがわかりました。もちろん、あなたが戻ってそれをオンにすることができますが、その後、クエリのログを見て、それは愚かな2つの無意味なクエリは後から再びオフオートコミット入れて接続されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top