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 つのクエリをどちらの順序で実行しても、正しい結果を得ることができます。
データベースへの変更のコミットに関連する何かが間違っているようですが、初心者としてはわかりません。この問題の診断にご協力いただければ幸いです。