使用过其他编程/脚本语言后,我对 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/