Jua*_*nra 8 mysql node.js sequelize.js
我有一个"myTable"mysql表,其中myTable.id由另一个表上的外键引用.我需要截断"myTable".通常使用mysql shell我会这样做:
mysql> SET FOREIGN_KEY_CHECKS = 0; truncate table myTable; SET FOREIGN_KEY_CHECKS = 1;
Run Code Online (Sandbox Code Playgroud)
用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`
Run Code Online (Sandbox Code Playgroud)
如果我按顺序执行查询,我不能截断表:
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint
Run Code Online (Sandbox Code Playgroud)
gal*_*lki 15
我通过查看另一个问题得到了这个,它在v4.13.2上对我有用
MyTableModel.destroy({ truncate: { cascade: true } });
Run Code Online (Sandbox Code Playgroud)
这种情况正在发生,因为sequelize不允许您通过一次sequelize.query调用执行多个查询.现在只处理所描述的场景,sequelize.sync({ force: true })其中删除所有表并在之后重新创建它们.该方法在内部使用以下代码:
它基本上加载每个表并检查是否有外键.如果是这种情况,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 ...
})
Run Code Online (Sandbox Code Playgroud)
这是因为事务使用专用连接,这意味着您可以轻松地连续执行命令.
我正在使用sequelize 3.24.3你可以做到
MyTableModel.truncate({ cascade: true });
Run Code Online (Sandbox Code Playgroud)
这是该cascade选项的文档
仅与TRUNCATE一起使用.截断具有指定表的外键引用的所有表,或由于CASCADE而添加到组的任何表.
小智 5
我正在使用 sequelise 3.5.1 版,sdepolds 解决方案不再起作用,因为 sequelise api 已更改。调整他的解决方案将导致:
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 ...
})
Run Code Online (Sandbox Code Playgroud)
根据Sequelise 的文档,链中的最后一个承诺触发了交易的提交。此外,不再需要sdepolds答案中的第二个参数 (null) 。此外,必须为 outta 返回 sequelize.query。
| 归档时间: |
|
| 查看次数: |
10048 次 |
| 最近记录: |