Nodejs会如何截断如何截断外键引用的表

我有一个“myTable”mysql表,其中myTable.id由另一个表上的外键引用。 我需要截断“myTable”。 通常与MySQL的壳我会做:

mysql> SET FOREIGN_KEY_CHECKS = 0; truncate table myTable; SET FOREIGN_KEY_CHECKS = 1; 

有没有什么办法做这个sequelize?

我试图执行

sequelize.query('SET FOREIGN_KEY_CHECKS = 0; truncate table myTable; SET FOREIGN_KEY_CHECKS = 1;')

但我有错误:

 `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 'truncate table myTable; SET FOREIGN_KEY_CHECKS = 1' at line 1` 

如果我连续执行查询,我不能截断表:

 ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint 

发生这种情况,因为sequelize不会允许您使用一个sequelize.query调用执行多个查询。 所描述的场景现在只处理sequelize.sync({ force: true }) ,后者将删除所有表并在之后重新创build它们。 该方法在内部使用以下代码:

https://github.com/sequelize/sequelize/blob/a014bd8d172fb8fd9881cee866abfcab842c30fc/lib/query-interface.js#L227-228

它基本上加载每个表,并检查是否有外键。 如果是这样的话,sequelize会把它们放在另一个表之前。 你可以采用这个逻辑。 此外:如果你决定实现这些东西,你可能会在github上打开一个pull请求。 那会很难。 另一个可能会起作用的选项如下:

 sequelize.transaction(function(t) { var options = { raw: true, transaction: t } sequelize .query('SET FOREIGN_KEY_CHECKS = 0', null, options) .then(function() { return sequelize.query('truncate table myTable', null, options) }) .then(function() { return sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, options) }) .then(function() { return t.commit() }) }).success(function() { // go on here ... }) 

这是可行的,因为事务使用专用连接,这意味着您可以轻松地连续执行命令。

我正在使用续集版本3.5.1和sdepolds解决scheme不再工作,因为续集api已经改变。 调整他的解决scheme将导致:

 sequelize.transaction(function(t) { var options = { raw: true, transaction: t } return sequelize .query('SET FOREIGN_KEY_CHECKS = 0', options) .then(function() { return sequelize.query('truncate table myTable', options) }) .then(function() { return sequelize.query('SET FOREIGN_KEY_CHECKS = 1', options) }) }).then(function() { // go on here ... }) 

根据Sequelise的文档 ,链中的最后一个承诺触发了交易的提交。 此外, sdepolds答案中的第二个参数(null)不再需要。 此外sequelize.query必须返回outta然后。

我使用续集3.24.3,你可以做

 MyTableModel.truncate({ cascade: true }); 

这里是cascade选项的文档

仅与TRUNCATE配合使用。 截断所有具有对指定表的外键引用的表,或由于CASCADE而添加到组中的任何表。

我通过查看另一个问题得到了这个,它在v4.13.2上为我工作

 MyTableModel.destroy({ truncate: { cascade: true } });