py mysql .err.ProgrammingError 1064 в простом многострочном SQL запросе для mariadb - PullRequest
0 голосов
/ 22 января 2020

Я перепробовал все и получаю эту ошибку:

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, и multi sql (хотя это означало многострочное sql, но это не так). Если я закомментирую строку 2, она также выдаст ошибку в строке 3. Извините, что беспокою, но я смотрел на это часами и не могу понять!

РЕДАКТИРОВАТЬ: Очевидный ответ таков, но я ' Я все еще хотел бы знать, почему ему не нравится оригинальный запрос:

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

Ответы [ 2 ]

1 голос
/ 22 января 2020

По соображениям безопасности (в основном SQL внедрение) серверы MariaDB (и MySQL) по умолчанию не поддерживают выполнение нескольких операторов SQL.

Для поддержки выполнения нескольких операторов требуется клиент отправить команду COM_SET_OPTION и флаг MYSQL_OPTION_MULTI_STATEMENTS_ON на сервер, который не поддерживается Py MySQL.

0 голосов
/ 26 января 2020

Не пытайтесь выполнить более одного оператора в вызове.

Используйте BEGIN и COMMIT.

Используйте 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"
...