无法使用sequelize创建存储过程

问题描述 投票:0回答:3

我正在运行以下 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
});
javascript mysql stored-procedures sequelize.js
3个回答
5
投票

DELIMITER
不是MySQL服务器的一部分,它是MySQL命令行客户端的一部分。驱动程序中不提供此功能。

来源:https://github.com/mysqljs/mysql/issues/280#issuecomment-8081626


2
投票

您的错误实际上在最后一行。取出

$$
后的
DELIMITER;
语句:
DELIMITER;
将分隔符重置为
;
,之后的
$$
会混淆语法分析器。


0
投票

我在 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 客户端使用引号或反引号来确定查询的结束位置。

© www.soinside.com 2019 - 2024. All rights reserved.