sequelize.sync({ force: true });
を介して同期を続編する前に、データベースからすべてのテーブルを削除するスクリプトを実行しようとしています。
スクリプトをコンソールから実行すると問題なく実行されます。node.jsアプリケーションからスクリプトを実行しようとすると問題が発生します。 MySqlは解析エラーを返します。
_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\';' }
Googleでも sequelize docs page (query
メソッドの特定のパラメーターを探しました)でも、sequelizeを使用した複数の生のクエリに関して何も見つかりませんでした。
私は このスレッド SOクローンから、人々は同じ問題を抱えているように見えますが、解決策が何であるかを理解できません。
を使用してmultipleStatements
オプションを渡すことができます
new Sequelize(user, pass, db, {
dialectOptions: {
multipleStatements: true
}
});
dialectOptions
に入れたものはすべて、基盤となる接続ライブラリ(この場合はmysql
)に渡されます。
使用されている基盤となるmysqlモジュールに応じて、少なくともmysql
/mysql2
はmultipleStatements: true
接続設定 をサポートします。これにより、一度に複数のクエリを送信できます。デフォルトでは、セキュリティ上の理由から無効になっています。
使用して修正:
dialectOptions: {
multipleStatements: true
}