我正在使用 "sequelize": "^5.8.6"
并且我已经定义了两个模型,company 和 dividend。
我的 company.js
模型如下所示:
'use strict';
module.exports = (sequelize, DataTypes) => {
const Company = sequelize.define('Company', {
company_name: DataTypes.STRING,
company_link: DataTypes.STRING,
ticker: DataTypes.STRING,
description: DataTypes.STRING
}, {});
Company.associate = function(models) {
Company.hasMany(models.Rating, { onDelete: 'cascade' });
Company.hasMany(models.Dividend, { onDelete: 'cascade' });
};
return Company;
};
我的 dividend.js
模型如下所示:
'use strict';
module.exports = (sequelize, DataTypes) => {
const Dividend = sequelize.define('Dividend', {
period: DataTypes.STRING,
amount: DataTypes.FLOAT,
payable_date: DataTypes.DATE,
}, {});
Dividend.associate = function(models) {
Dividend.belongsTo(models.Company, { onDelete: 'cascade' });
};
return Dividend;
};
我的 truncate.js
函数如下所示:
const models = require('../models');
const truncateTable = (modelName) =>
models[modelName].destroy({
where: {},
force: true,
});
module.exports = async function truncate(model) {
if (model) {
return truncateTable(model);
}
return Promise.all(
Object.keys(models).map((key) => {
if (['sequelize', 'Sequelize'].includes(key)) return null;
return truncateTable(key);
})
);
}
尝试 chop 两个模型时出现以下错误:
{ SequelizeDatabaseError: Cannot truncate a table referenced in a foreign key constraint (`test-db`.`dividends`, CONSTRAINT
`dividends_ibfk_1` FOREIGN KEY (`CompanyId`) REFERENCES `test-db`.`companies` (`id`))
at Query.formatError (c:\test\node_modules\sequelize\lib\dialects\mysql\query.js:239:16)
at Query.handler [as onResult] (c:\test\node_modules\sequelize\lib\dialects\mysql\query.js:46:23)
at Query.execute (c:\test\node_modules\mysql2\lib\commands\command.js:30:14)
at Connection.handlePacket (c:\test\node_modules\mysql2\lib\connection.js:449:32)
at PacketParser.Connection.packetParser.p [as onPacket] (c:\test\node_modules\mysql2\lib\connection.js:72:12)
at PacketParser.executeStart (c:\test\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.Connection.stream.on.data (c:\test\node_modules\mysql2\lib\connection.js:79:25)
at Socket.emit (events.js:189:13)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
name: 'SequelizeDatabaseError',
parent:
{ Error: Cannot truncate a table referenced in a foreign key constraint (`test-db`.`dividends`, CONSTRAINT `dividends_ibfk_1` FOREIGN KEY (`CompanyId`) REFERENCES `test-db`.`companies` (`id`))
at Packet.asError (c:\test\node_modules\mysql2\lib\packets\packet.js:684:17)
at Query.execute (c:\test\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (c:\test\node_modules\mysql2\lib\connection.js:449:32)
at PacketParser.Connection.packetParser.p [as onPacket] (c:\test\node_modules\mysql2\lib\connection.js:72:12)
at PacketParser.executeStart (c:\test\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.Connection.stream.on.data (c:\test\node_modules\mysql2\lib\connection.js:79:25)
at Socket.emit (events.js:189:13)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
code: 'ER_TRUNCATE_ILLEGAL_FK',
errno: 1701,
sqlState: '42000',
sqlMessage:
'Cannot truncate a table referenced in a foreign key constraint (`test-db`.`dividends`, CONSTRAINT `dividends_ibfk_1`
FOREIGN KEY (`CompanyId`) REFERENCES `test-db`.`companies` (`id`))',
sql: 'TRUNCATE `Companies`' },
original:
{ Error: Cannot truncate a table referenced in a foreign key constraint (`test-db`.`dividends`, CONSTRAINT `dividends_ibfk_1` FOREIGN KEY (`CompanyId`) REFERENCES `test-db`.`companies` (`id`))
at Packet.asError (c:\test\node_modules\mysql2\lib\packets\packet.js:684:17)
at Query.execute (c:\test\node_modules\mysql2\lib\commands\command.js:28:26)
at Connection.handlePacket (c:\test\node_modules\mysql2\lib\connection.js:449:32)
at PacketParser.Connection.packetParser.p [as onPacket] (c:\test\node_modules\mysql2\lib\connection.js:72:12)
at PacketParser.executeStart (c:\test\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.Connection.stream.on.data (c:\test\node_modules\mysql2\lib\connection.js:79:25)
at Socket.emit (events.js:189:13)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
code: 'ER_TRUNCATE_ILLEGAL_FK',
errno: 1701,
sqlState: '42000',
sqlMessage:
'Cannot truncate a table referenced in a foreign key constraint (`test-db`.`dividends`, CONSTRAINT `dividends_ibfk_1`
FOREIGN KEY (`CompanyId`) REFERENCES `test-db`.`companies` (`id`))',
sql: 'TRUNCATE `Companies`' },
sql: 'TRUNCATE `Companies`' }
我为什么会收到此错误有什么建议吗?
感谢您的回复!
最佳答案
给你:
sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true })
当您需要重新创建表并以任何父子顺序加载数据时,暂时禁用引用约束(将 FOREIGN_KEY_CHECKS 设置为 0)很有用。
使用 SET FOREIGN_KEY_CHECKS = 0
代码:
const models = require('../models');
const truncateTable = (modelName) =>
models[modelName].destroy({
where: {},
force: true,
});
module.exports = async function truncate(model) {
if (model) {
return truncateTable(model);
}
await sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true }); //<---- Do not check referential constraints
return Promise.all(
Object.keys(models).map((key) => {
if (['sequelize', 'Sequelize'].includes(key)) return null;
return truncateTable(key);
})
);
}
// once you get the response from truncate, run this, and it will set foreign key checks again
sequelize.query('SET FOREIGN_KEY_CHECKS = 1', { raw: true }); // <-- Specify to check referential constraints
流程:
- First : With SET FOREIGN_KEY_CHECKS = 0 -- Do not check referential constraints
- Second : So we can destroy all the tables and we'll not get error regarding foreign key constraint
- Third : once all the tables got truncate we'll set SET FOREIGN_KEY_CHECKS = 1 back -- Specify to check referential
constraints
关于javascript - Sequelize 数据库错误: Cannot truncate a table referenced in a foreign key constraint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150491/