Python mysql 不提交

标签 python mysql

使用过其他编程/脚本语言后,我对 Python 的 mysql 接口(interface)感到非常困惑(我对 Python 有点陌生)我无法提交更改。我已将代码剥离到最低限度:

#!/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 使用相同的凭据提交更改,因此这不应该是权限问题。

我做错了什么?

最佳答案

服务器重启后(与此无关),我现在无法重现我的问题。一切都按预期工作。我很想知道出了什么问题,但它似乎更像是服务器/配置问题,而不是编程问题。

为了那些偶然发现这个问题寻求智慧的人的利益 (咳咳)对我学到的东西的一个小解释。

与我经常使用的其他语言(Perl、TCL)相反,Python 默认关闭自动提交。此外,mysql CLI 以自动提交启动。但是 Python 的 PEP0249 指出:

Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on

.

问题是,如果禁用了自动提交的 session 结束时没有 明确提交最终事务,MySQL 回滚该事务。

所以,你有三个选择:

  • 开启自动提交
  • 明确提交您的更改
  • 丢失您的数据:-)

可以在连接到数据库时直接打开自动提交:

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()

我可以验证对同一条记录的第二次启动是否会等到第一次释放锁。

非常感谢您的时间、耐心和保证,我的代码并没有我想象的那么错误。

关于Python mysql 不提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857632/

相关文章:

Python - 如何一键设置多个命令的优先级?

python - 使用 Python 重命名文件夹中的文件,并使用 Excel 中的名称映射

python - 如何获取任何网站的域名?

php - MySQLi 准备语句返回 false

mysql - 没有可用的包 mysql-server

php - Ajax MYSQL 搜索和排序结果

python - 导入 tensorflow "AlreadyExistsError: Another metric with the same name already exists."时出错

python - 使用 os.scandir() 引发 AttributeError : __exit__

具有多个分组或排序的 mysql 查询优化

database - mysqldump 所有带有数据的表,带有创建和添加-删除表语句