Как вставить alid JSON, содержащий одинарные кавычки в MySQL - PullRequest
1 голос
/ 23 апреля 2020

Моя цель - просто преобразовать объект JavaScript в JSON и вставить его в строку MySQL, в которой хранится тип данных MySQL JSON. Этот процесс должен происходить как часть большой пакетной вставки, поэтому я не могу редактировать данные вручную. При вызове JSON .stringify для объекта я получаю действительное значение JSON, но, поскольку объект содержит текст песни, который часто содержит одинарные кавычки, при попытке выполнить запрос SQL, MySQL выдает ошибку разбора ,

Это прекрасно работает

const validJson = '{"foo": "bar", "buzz": 1}';
INSERT INTO table_name ( songid, json )       
VALUES ( ${song.songid}, ${validJson} );

Но это не

const validJsonWithASingleQuote = {"foo's": "bar", "buzz": 1}';
INSERT INTO table_name ( songid, json )       
VALUES ( ${song.songid}, ${validJsonWithASingleQuote} );

Я также попытался использовать подготовленное утверждение без удачи

PREPARE myInsert FROM 'INSERT INTO table_name ( songid, json ) VALUES ( ?, ? )';
SET @a = ${song.songid};
SET @b = ${JSON.stringify(r)};
EXECUTE myInsert USING @a, @b;

Я должен также упомянуть, что исходные JavaScript объекты содержат строки, в которых одинарные кавычки экранированы знаком "\". Метод JSON .stringify декодирует эти обратные слэши.

К сожалению, все вопросы SO, которые я нашел в этой топи c, либо рекомендуют экранировать одиночные кавычки с помощью "\" вручную, либо они не разрешены. Есть ли програматический c способ сделать это? 1028 *? Возможно, метод JavaScript или MySQL, который генерирует действительные JSON и оставляет последовательности "\" в?

1 Ответ

1 голос
/ 23 апреля 2020

Я наконец нашел свой путь к этому ответу: { ссылка }

Оказывается, драйвер Node.js для mysql содержит метод escape. Итак, что-то вроде этого работает:

PREPARE myInsert FROM 'INSERT INTO table_name ( songid, json ) VALUES ( ?, ? )';
SET @a = ${song.songid};
SET @b = ${mysql.escape(JSON.stringify(sr))};
EXECUTE myInsert USING @a, @b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...