Python mysql不提交

Ljm*_*art 5 python mysql

与其他编程/脚本语言一起工作后,我完全被Python的mysql接口所困扰(我对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()
Run Code Online (Sandbox Code Playgroud)

我本以为自动提交会成功,但事实并非如此。此外,mariadb_connection.commit()也不会执行任何更改。该数据库(相关程度最高):

    number      INTEGER,
    type        VARCHAR(255),
    file        VARCHAR(255),
    year        INTEGER,
    month       INTEGER,
    descr       VARCHAR(4096)
Run Code Online (Sandbox Code Playgroud)

我能够使用TCL / Tk使用相同的凭据来提交更改,因此这应该不是权限问题。

我究竟做错了什么?

Ljm*_*art 8

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

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

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

请注意,如果数据库支持自动提交功能,则最初必须关闭此功能。可以提供接口方法将其重新打开

.

问题是,如果禁用了自动提交的会话在没有明确提交最终事务的情况下结束,MySQL 会回滚该事务。

所以,你有三个选择:

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

连接数据库时可以直接开启自动提交:

import mysql.connector as mariadb
connection = mariadb.connect(user='testdb', password='testdb',
    database='testdb', host='127.0.0.1',autocommit=True)
Run Code Online (Sandbox Code Playgroud)

或单独:

connection.autocommit=True
Run Code Online (Sandbox Code Playgroud)

显式提交更改是通过

connection.commit()
Run Code Online (Sandbox Code Playgroud)

请注意,提交是通过与数据库的连接完成的,而不是通过游标完成的。

此外,我认为这可能是一个锁定问题,但使用此脚本:

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()
Run Code Online (Sandbox Code Playgroud)

我可以验证同一记录上的第二次启动会等到第一次释放锁定。

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