与其他编程/脚本语言一起工作后,我完全被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使用相同的凭据来提交更改,因此这应该不是权限问题。
我究竟做错了什么?
服务器重启后(与此无关),我现在无法重现我的问题。一切都按预期工作。我很想知道出了什么问题,但它似乎更像是服务器/配置问题而不是编程问题。
为了那些偶然发现这个问题寻求智慧的人的利益(咳咳)我学到的东西的一个小解释。
与我经常使用的其他语言(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)
我可以验证同一记录上的第二次启动会等到第一次释放锁定。
所以感谢您的时间、耐心和保证,我的代码没有我想象的那么错误。
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |