我正在运行以下 SQL 查询:
Executing (default): DROP PROCEDURE IF EXISTS x;
DELIMITER $$
CREATE PROCEDURE x()
BEGIN
# do something
END $$
DELIMITER; $$
像这样:
sequelize.query(query, {
type: sequelize.QueryTypes.SELECT
});
但我收到此错误(即使它工作得很好,如果我使用任何其他 SQL 客户端):
Sequelize数据库错误: ER_PARSE_ERROR:您的 SQL 语法有错误;检查手册 与您的 MySQL 服务器版本相对应的正确语法 在“DELIMITER $$
”附近使用创建过程 x()
开始
我已经将
multipleStatements = true
添加到我的连接配置中,但它没有执行任何操作。
更新
我最终使用
RAW
来代替,就像这样:
sequelize.query(query, {
type: sequelize.QueryTypes.RAW
});
DELIMITER
不是MySQL服务器的一部分,它是MySQL命令行客户端的一部分。驱动程序中不提供此功能。
来源:https://github.com/mysqljs/mysql/issues/280#issuecomment-8081626
您的错误实际上在最后一行。取出
$$
后的DELIMITER;
语句: DELIMITER;
将分隔符重置为 ;
,之后的 $$
会混淆语法分析器。
我在 Sequelize with MySQL 中也遇到了这个问题。对我有用的解决方案是删除这两个
DELIMITER
语句。这将使原始海报程序看起来像这样:
const query = `DROP PROCEDURE IF EXISTS x;
CREATE PROCEDURE x()
BEGIN
SELECT 1;
SELECT 2;
END;`
await sequelize.query(query, {
type: sequelize.QueryTypes.RAW
});
正如这个 Github 评论所建议的,不仅
DELIMITER
对于 Node.js MySQL 客户端不可用,而且没有必要,因为 Node.js 客户端使用引号或反引号来确定查询的结束位置。