使用过其他编程/脚本语言后,我对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使用相同的凭据提交更改,因此它不应该是权限问题。
我做错了什么?
答案 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()
我可以验证同一记录上的第二次启动是否等到第一次发布锁定。
非常感谢您的时间,耐心和保证,我的代码并没有像我想象的那样错误。