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

需要帮助诊断Python/MySQL插入/更新异常吗,python,mysql,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”包含数据库的有效访

我正在学习使用从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脚本,然后进行更新,结果如下:

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”作为名称

在带有update的初始数据库上运行Python脚本,然后插入(与脚本中块1和块2的顺序相反)生成:

使用phpMyAdmin或Sequel Pro查看数据库时,第1行中的名称显示为“Ethel”

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

似乎与向数据库提交更改有关的某些内容出现了问题,但作为一名新手,我没有看到这一点。如果您能帮助诊断此问题,我将不胜感激。

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

cnx.commit()
您在代码中省略了
()
括号

您还可以在多个位置引用
游标。关闭
方法而不调用它;不像Python会通过垃圾收集自动清理这些内容那样重要。

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

cnx.commit()
您在代码中省略了
()
括号


您还可以在多个位置引用
游标。关闭
方法而不调用它;不像Python会通过垃圾收集自动清理这些垃圾那样重要。

这并不是因为其他部分很重要,而是OP在第一次查询后也不会关闭游标:
cursor.close不是说这另一部分同样重要,但是OP在第一次查询后也不会关闭游标:
cursor.close无需使用
分号。也不需要使用
x=(“foo”)
包装字符串赋值,也不需要使用
分号。也不需要用
x=(“foo”)