0

mysql.org Web サイトからダウンロードした MySQL Connector/Python ライブラリを使用して、MySQL データベースにアクセスする方法を学んでいます。私の環境は、OS X 10.6、Eclipse Indigo with PyDev、および新しくインストールされたバージョンの MySql (5.5.28、64 ビット)、Sequel Pro、および phpMyAdmin です。

私のテストデータベースには、「id」、「name」、および「ssn」列を持つ「Employees」という1つのテーブルがあります。最初は、(1, Lucy, 1234) と (2, Alex, 3456) の 2 つの行があります。

ここに Python スクリプトがあります。変数「config」には、データベースの有効なアクセス情報が含まれています。

import mysql.connector
from mysql.connector import errorcode

config = {…}

try:
    cnx = mysql.connector.connect(**config)
except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong your username or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exist")
    else:
        print(err)
else:
    print ("original database contents")

    cursor = cnx.cursor()
    query = ("SELECT name, ssn FROM Employees")  # fetches all employees names and ssns
    cursor.execute(query)
    for (name, ssn) in cursor:  # iterates over fetched data
        print(name, ssn)  # print one employee per line
    cursor.close;

    # block 1: insert a new employee into row 3
    cursor = cnx.cursor()
    cursor.execute("INSERT INTO Employees (id, name, ssn) VALUES (3, 'Sam', '5678')")
    cnx.commit()
    cursor.close()

    # block 2: update the name in the first row
    cursor = cnx.cursor()
    cursor.execute("UPDATE Employees SET name='Ethel' WHERE id=1")
    cnx.commit;
    cursor.close()

    print ("after inserting Sam and updating Lucy to Ethel")

    cursor = cnx.cursor()
    query = ("SELECT name, ssn FROM Employees")  # fetches all employees' names and ssns
    cursor.execute(query)
    for (name, ssn) in cursor:  # iterates over fetched data
        print(name, ssn)  # print one employee per line
    cursor.close;

cnx.close()

print ("end of database test")

挿入を使用して初期データベースで Python スクリプトを実行し、更新すると、次のようになります。

original database contents
(u'Lucy', u'1234')
(u'Alex', u'3456')
after inserting Sam and updating Lucy to Ethel
(u'Ethel', u'1234')
(u'Alex', u'3456')
(u'Sam', u'5678')
end of database test

phpMyAdmin または Sequel Pro でデータベースを表示すると、行 1 の名前として「Lucy」が表示されます。

最初のデータベースで Python スクリプトを実行し、更新してから挿入します (スクリプトのブロック 1 とブロック 2 の順序を逆にします)。

original database contents
(u'Lucy', u'1234')
(u'Alex', u'3456')
after inserting Sam and updating Lucy to Ethel
(u'Ethel', u'1234')
(u'Alex', u'3456')
(u'Sam', u'5678')
end of database test

phpMyAdmin または Sequel Pro でデータベースを表示すると、行 1 の名前として「Ethel」が表示されるようになりました。

Sequel Pro で開いた最初のデータベースから始めて、2 つのクエリをどちらの順序で実行しても、正しい結果を得ることができます。

データベースへの変更のコミットに関連する何かが間違っているようですが、初心者としてはわかりません。この問題の診断にご協力いただければ幸いです。

4

1 に答える 1

4

commit メソッドを呼び出して変更をデータベースにコミットする必要があります。そうしないと、トランザクションが保存されず、他の接続で変更が表示されません。

cnx.commit()

()コードで括弧を省略しました。

cursor.closeメソッドを呼び出さずに複数の場所で参照することもできます。Python がガベージ コレクションによってそれらを自動的にクリーンアップするほど大したことではありません。

于 2012-11-21T16:51:32.357 に答える