pymysql.err.ProgrammingError 1064 简单多行 SQL 查询 mariadb

pymysql.err.ProgrammingError 1064 in simple multiline SQL query for mariadb

我已经尝试了所有方法并不断收到此错误:

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax to use near
'INSERT INTO tabSingles (doctype, field, value) VALUES ('Bank Reconciliation', 'a' at line 2")

扩展查询(python格式扩展后):

SELECT value INTO @var FROM tabSingles WHERE doctype = 'Bank Reconciliation' AND field = 'bank_account';
INSERT INTO tabSingles (doctype, field, value) VALUES ('Bank Reconciliation', 'account', @var);
DELETE FROM tabSingles WHERE doctype = 'Bank Reconciliation' AND field = 'bank_account';

谁能看出问题所在?多行查询有问题吗?我已经尝试了 mariadb 命令行上的各个行,它们似乎按预期工作。我也尝试了 frappe.db.sql 和 multisql (以为它意味着多行 sql 但不是)。如果我注释掉第 2 行,它也会在第 3 行出错。抱歉打扰,但我已经盯着它看了好几个小时了,还是想不通!

编辑: 显而易见的答案是这样的,但我还是想知道为什么它不喜欢原来的查询:

UPDATE tabSingles SET field='{new_name}' WHERE doctype='{doctype}' AND field='{old_name}';

出于安全原因(主要是SQL注入)MariaDB(和MySQL)服务器默认不支持执行多个SQL语句。

为了支持多条语句执行,客户端需要向服务器发送COM_SET_OPTION命令和MYSQL_OPTION_MULTI_STATEMENTS_ON标志,PyMySQL不支持。

不要尝试在一个调用中 运行 多个语句。

请使用 BEGINCOMMIT

请使用 FOR UPDATE

您需要 5 个单独的命令:

BEGIN;
SELECT ... FOR UPDATE;  -- to keep other connections from messing with the row(s).
UPDATE ...;
DELETE ...
COMMIT;   -- do all of the above "atomically"