Python mysql不提交

时间:2017-12-17 17:23:58

标签: 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()

我本以为autocommit可以做到这一点,但事实并非如此。此外,mariadb_connection.commit()无法提交更改。 数据库(尽可能相关):

    number      INTEGER,
    type        VARCHAR(255),
    file        VARCHAR(255),
    year        INTEGER,
    month       INTEGER,
    descr       VARCHAR(4096)

我可以使用TCL / Tk使用相同的凭据提交更改,因此它不应该是权限问题。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

  

请注意,如果数据库支持自动提交功能,则必须这样做   最初关闭。可以提供接口方法以将其返回   上

问题是如果禁用自动提交的会话没有结束 显式提交最终事务,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()

我可以验证同一记录上的第二次启动是否等到第一次发布锁定。

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