【发布时间】:2018-12-14 20:47:24
【问题描述】:
我正在使用 Python 3.6、mysql-connector-python 8.0.11 和 8.0.11 MySQL 社区服务器 - GPL。有问题的表正在使用 innoDB 引擎。
使用 MySQL Workbench 时我可以输入:
使用测试;开始交易; SELECT * FROM tasks WHERE task_status != 1 LIMIT 1 FOR UPDATE;
它按预期提供了 1 条记录:
当我使用 python3 的脚本时(来自同一台机器 - 相同的访问权限等):
* SQL QRY: START TRANSACTION; SELECT * FROM test WHERE task_status != 1 LIMIT 1 FOR UPDATE;
* SQL RES: No result set to fetch from.
这是我的脚本的调试输出。如果我将 Query 更改为普通 SELECT,我会得到输出。
* SQL QRY: SELECT * FROM test WHERE task_status != 1 LIMIT 1;
* SQL RES: [(1, 0, 'TASK0001')]
我知道 SELECT * 不是要走的路,但现在只是想得到一些回应。
我正在尝试允许多个工作脚本在没有工作人员执行相同任务的情况下执行一项任务:
- 执行选择并行锁定任务,以便其他工作人员的“SELECT”查询不会显示它们,
- 将任务状态设置为“正在处理”并解锁记录。
这是我第一次尝试锁定,所以这是一个新领域。我能够进行普通查询和填充表等,所以有一些经验,但没有锁定。
表创建:
create table test
(
id int auto_increment
primary key,
task_status int not null,
task_ref varchar(16) not null
);
问题:
这是正确的心态吗? IE。有没有更 Pythonic/mysql 的方法来做到这一点?
我需要以特定方式启动 mysql 连接吗?为什么它可以使用 MySQL 工作台而不是通过脚本工作?我已经尝试使用直接 mysql,这也可以 - 所以我认为它是 python 连接器可能需要正确设置,因为它是唯一不工作的组件。
目前我在连接器上使用“autocommit=1”,在光标上使用“buffered=True”。我知道您可以在“START TRANSACTION”之前在 SQL 中设置“autocommit=0”,因此了解锁定我可能需要这样做,但对于所有其他事务,我更愿意保持自动提交。这可以和/或可行吗?
代码:
#!/usr/bin/env python
import mysql.connector
import pprint
conn = mysql.connector.connect(user='testuser',
password='testpass',
host='127.0.0.1',
database='test_db',
autocommit=True)
dbc = conn.cursor(buffered=True)
qry = "START TRANSACTION; SELECT * FROM 'test' WHERE task_status != 1 LIMIT 1 ON UPDATE;"
sql_select = dbc.execute(qry)
try:
output = dbc.fetchall()
except mysql.connector.Error as e:
print(" * SQL QRY: {0}".format(qry))
print(" * SQL RES: {0}".format(e))
exit()
else:
print(" * SQL QRY: {0}".format(qry))
print(" * SQL RES: {0}".format(output))
非常感谢,
弗兰克
【问题讨论】:
-
显示 Python 代码
标签: mysql python-3.x transactions mysql-connector-python