问题描述
我正在尝试使用knex在迁移文件中执行一些sql指令。
为了获得更大的灵活性,我想将所有相关的sql放在一个字符串中。
问题是:当我在字符串中有两个或多个语句时,MysqL无法执行
了解它并引发以下错误:
“ You have an error in your sql Syntax; check the manual that corresponds to your MariaDB server..."
我相信,这是由于我原始结果中的\ n,\ s和\ t字符引起的。
我已经尝试过.replace(/\n/g,'')
和.replace(/\t/g,'')
,但是对它没有任何影响。
在这种情况下,有什么方法可以执行包含多个语句的RAW字符串?
非常感谢。
我的原始方法:
// Fail
exports.up = async (knex) => {
try {
console.info('Migrating CLIENT...');
return await knex.raw(
`
DELETE FROM monthly_consumption;
DELETE FROM project;
DELETE FROM project_client;
DELETE FROM client;
ALTER TABLE client DROP PRIMARY KEY;
ALTER TABLE client ADD id BIGINT auto_increment;
ALTER TABLE client ADD CONSTRAINT client_pk PRIMARY KEY (id);
`
.replace(/\n/g,'')
.replace(/\t/g,' ')
);
} catch (err) {
console.error('******** ERROR ********\n',err);
throw new Error(err);
}
};
另一方面,如果我运行以下命令,它将起作用,也就是说,如果仅包含一条语句,它将可以正常工作。
// Success
exports.up = async (knex) => {
try {
console.info('Migrating CLIENT...');
return await knex.raw(
`
DELETE FROM monthly_consumption;
`
.replace(/\n/g,'')
.replace(/\t/g,' ')
);
} catch (err) {
console.error('******** ERROR ********\n',err);
throw new Error(err);
}
};
我也尝试将所有内容放在一行中,但再次失败:
// Fail
exports.up = async (knex) => {
try {
console.info('Migrating CLIENT...');
return await knex.raw(
`
DELETE FROM monthly_consumption; DELETE FROM project;
`
.replace(/\n/g,err);
throw new Error(err);
}
};
migration Failed with error: Error: DELETE FROM monthly_consumption; DELETE FROM project; - ER_PARSE_ERROR: 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 'DELETE FROM project' at line 1
解决方法
我找到了解决方案。它与MySQL本身有关。我们需要启用多语句功能。在knexfile.js里面,我只是插入:
multipleStatements: true
最后,它运行良好。