2017-12-17 9 views
1

他のプログラミング/スクリプト言語で作業していたので、私はPythonのmysqlインターフェイス(私は少しPythonに慣れています)に完全に困惑しました。私は最低限にコードを取り除いていますPython mysqlはコミットしません

#!/usr/bin/python 

import mysql.connector as mariadb 

mariadb_connection = mariadb.connect(user='testdb', password='testdb', database='testdb', host='127.0.0.1',autocommit=True) 
mariadb_connection.autocommit=True 
cursor = mariadb_connection.cursor(buffered=True) 
cursor.execute("UPDATE testdb SET descr='konijn' WHERE number=14549") 
mariadb_connection.commit() 
mariadb_connection.close() 

私は自動コミットがトリックを行うだろうと期待しているだろうが、そうでありません。また、mariadb_connection.commit()は変更をコミットすることもありません。

number  INTEGER, 
    type  VARCHAR(255), 
    file  VARCHAR(255), 
    year  INTEGER, 
    month  INTEGER, 
    descr  VARCHAR(4096) 

私はTCL/Tkのを使用して同じ資格情報を使用して、変更をコミットすることができていますので、アクセス許可の問題になることはありません。 データベースは、(限り、関連するため)です。

私は間違っていますか?

+0

'number'の型がint型であることは確かですか? – roganjosh

+1

はい。質問の表の説明を追加しました。 –

+0

興味深い。あなたは 'print(cursor.execute(" "SELECT * FROM testdb WHERE number = 14549" ")。fetchall())'から何を得ますか? – roganjosh

答えて

0

サーバーの再起動後(これとは関係なく)、問題を再現できません。すべてが期待どおりに機能します。私は何が間違っていたかを知りたがっていただろうが、プログラミング上の問題よりもサーバー/構成上の問題が多いようだ。

知恵を探してこの質問につきものになる人のために (エヘン)私が学んだことの小さな説明。

(Perl、TCL)私が頻繁に使用する他の言語とは対照的に、Pythonはデフォルトで自動コミットをオフにします。また、mysql CLIはautocommitをonにして起動します。しかし、PythonのPEP0249の状態:

注データベースが自動コミット機能をサポートしている場合、これは オフに最初にしなければならないことを。インタフェース方法は、 を

に戻すために提供することができます。

自動コミットを無効にしたセッションが、最終トランザクションを明示的にコミットせずに終了すると、MySQLはそのトランザクションをロールバックします。

だから、あなたは3つの選択肢があります:自動コミット

    • 電源を入れますが、明示的に自動コミットをオンに

    :-)あなたのデータは時に直接行うことができルース変更

  • をコミットデータベースに接続します。

    import mysql.connector as mariadb 
    connection = mariadb.connect(user='testdb', password='testdb', 
        database='testdb', host='127.0.0.1',autocommit=True) 
    

    または別々は:明示的に変更をコミット

    connection.autocommit=True 
    

    はないカーソルを介してデータベースへの接続を介して行われることをコミット

    connection.commit() 
    

    注を用いて行われます。

    また、私はそれがロックの問題あったが、この スクリプトを使っているかもしれないと思った:

    import mysql.connector as mariadb 
    number=input('->') 
    mariadb_connection = mariadb.connect(user='testdb', password='testdb',database='testdb', host='127.0.0.1') 
    cursor = mariadb_connection.cursor(buffered=True) 
    cursor.execute("UPDATE testdb SET descr='konijntje' WHERE number=%s",(number,)) 
    print 'rowcount',cursor.rowcount 
    number=input('->') 
    mariadb_connection.commit() 
    mariadb_connection.close() 
    

    私は同じレコード上の第二打ち上げは、最初のロックを解除するまで待機していることを確認できました。

    私のコードが間違っているとは思っていなかったので、忍耐と安心を感謝します。

  • 関連する問題