1

我已经尝试了一切并不断收到此错误:

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}';
4

2 回答 2

3

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

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

于 2020-01-22T10:30:47.820 回答
-1

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

使用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"
于 2020-01-26T17:27:27.597 回答