需要帮助诊断Python / MySQL插入/更新异常

时间:2012-11-21 16:45:30

标签: python mysql

我正在学习使用从mysql.org网站下载的MySQL Connector / Python库来访问MySQL数据库。我的环境是OS X 10.6,Eclipse Indigo和PyDev,以及新安装的MySql版本(5.5.28,64位),Sequel Pro和phpMyAdmin。

我的测试数据库有一个表“Employees”,其中包含“id”,“name”和“ssn”列。最初,有两行:(1,Lucy,1234)和(2,Alex,3456)。

这是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")

使用insert在初始数据库上运行Python脚本,然后更新yield:

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 查看数据库仍然显示“Lucy”作为第1行中的名称。

使用update在初始数据库上运行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 查看数据库现在显示“Ethel”作为第1行中的名称。

从Sequel Pro中打开的初始数据库开始,我可以按任意顺序执行两个查询并获得正确的结果。

似乎与提交数据库更改相关的内容出错了,但作为一个新手,我没有看到它。我很感激帮助诊断这个问题。

1 个答案:

答案 0 :(得分:4)

您需要调用提交方法将更改提交到数据库,否则永远不会保存事务,其他连接也不会看到更改。

cnx.commit()

您在代码中省略了()个括号。

您也可以在不调用的情况下在多个位置引用cursor.close方法;没有那么大,因为Python会通过垃圾收集自动清理它们。