如何在MySql中使用sequelize运行多个原始查询?

我想通过sequelize.sync({ force: true });运行一个脚本来从数据库中删除所有的表sequelize.sync({ force: true });

当我从控制台运行脚本时,脚本运行时没有问题,当我尝试从我的node.js应用程序运行时,问题就发生了; MySql返回一个分析错误。

的node.js

 var dropAllTables = [ 'SET FOREIGN_KEY_CHECKS = 0;', 'SET GROUP_CONCAT_MAX_LEN = 32768;', 'SET @tables = NULL;', "SELECT GROUP_CONCAT('`', table_name, '`') INTO @tables FROM information_schema.tables WHERE table_schema = (SELECT DATABASE());", "SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);", "SELECT IFNULL(@tables, 'SELECT 1') INTO @tables;", 'PREPARE stmt FROM @tables;', 'EXECUTE stmt;', 'DEALLOCATE PREPARE stmt;', 'SET FOREIGN_KEY_CHECKS = 1;', "SET GLOBAL sql_mode = 'STRICT_ALL_TABLES';" ].join(' '); sequelize.query(dropAllTables, { raw: true }).then(function() { return sequelize.sync({ force: true }); }).then(function() { console.log('Database recreated!'); callback(); }, function(err) { throw err; }); 

错误

{ [Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET GROUP_CONCAT_MAX_LEN = 32768; SET @tables = NULL; SELECT GROUP_CONCAT('`', t' at line 1] code: 'ER_PARSE_ERROR', errno: 1064, sqlState: '42000', index: 0, sql: 'SET FOREIGN_KEY_CHECKS = 0; SET GROUP_CONCAT_MAX_LEN = 32768; SET @tables = NULL; SELECT GROUP_CONCAT(\'`\', table_name, \'`\') INTO @tables FROM information_schema.tables WHERE table_schema = (SELECT DATABASE()); SET @tables = CONCAT(\'DROP TABLE IF EXISTS \', @tables); SELECT IFNULL(@tables, \'SELECT 1\') INTO @tables; PREPARE stmt FROM @tables; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET FOREIGN_KEY_CHECKS = 1; SET GLOBAL sql_mode = \'STRICT_ALL_TABLES\';' }

我没有发现任何关于谷歌sequelize多个原始查询或sequelize docs页面 (我查找query方法的具体参数)。

编辑:

我从一个SO克隆中发现了这个线程 ,在那里人们似乎有同样的问题,但是我不知道解决scheme是什么。

您可以使用传递multipleStatements选项

 new Sequelize(user, pass, db, { dialectOptions: { multipleStatements: true } }); 

你放进dialectOptions任何东西都会被传递给底层的连接库(在本例中是mysql

根据所使用的底层mysql模块,至lessmysql / mysql2支持multipleStatements: true 连接设置 。 这将允许您一次发送多个查询。 默认情况下,由于安全原因,它被禁用。