我正在尝试使用 Many:Many 与 Sequelize 的关联(针对 Postgre db)。
我想创建一个场所并将其与单个事务中的用户相关联。 field 和用户设置为正常的Sequelize模型,并通过连接表“userVenue”分别设置为对方的“belongToMany”。
问题是我似乎无法在同一交易中创建新场所及其第一个用户关联。 Postgre 抛出以下错误:
insert or update on table "userVenues" violates foreign key constraint "userVenues_venueId_fkey"
因为新的 field 还没有提交。
我想我需要在“userVenues”联结表中对“userId”和“venueId”设置外键约束,以便最初按照 Sequelize docs 延迟,但是,因为 Sequelize 正在自动定义联结表的“userId”和“venueId” ,我不知道如何将它们设置为 INITIALLY_DEFERRABLE。
我已经尝试简单地将事务设置为 SET_DEFERRED(根据同一个文档),我可以在日志中看到它确实向数据库发出了“SET CONSTRAINTS ALL DEFERRED”命令,但是由于 Sequelize 似乎将约束默认为 NOT (可延期)我仍然因同样的错误而失败。如果我不使用事务,则两个连续的 INSERTS 工作得很好。
有没有办法将这些外键定义为可延迟的?还是我以错误的方式接近这个?
非常感谢!
相关代码如下:
// *** ASSOCIATIONS ***
// The Venue association
Venue.belongsToMany(models.user, {
through: models.userVenue,
});
// The User association
User.belongsToMany(models.venue, {
through: models.userVenue,
});
// *** THE TRANSACTION ***
const newVenue = await db.sequelize.transaction(
{ deferrable: Sequelize.Deferrable.SET_DEFERRED },
async (t) => {
const newRow = await db.venue.create(
{ ...payload },
{ transaction: t }
);
await newRow.addUser(
socket.user,
{
through: { permit: 'edit' },
},
{ transaction: t }
);
return newRow;
}
最佳答案
经过进一步研究,这似乎是 Sequelize 中的一个错误:https://github.com/sequelize/sequelize/issues/8194
尽管它已被标记为错误,但尚未修复。一位乐于助人的用户在该线程中回复了我的帖子,并提供了潜在的修复,但目前没有拉取请求。
我目前使用的解决方法是在 DB Sync 之后运行这个原始查询来改变约束,如果有人觉得它有帮助的话。它确实需要了解约束名称。
await sequelize.query(
'ALTER TABLE "userVenues" ALTER CONSTRAINT "userVenues_venueId_fkey" DEFERRABLE INITIALLY DEFERRED'
);
关于node.js - 续写 ORM : Using Deferrable constraints on junction table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62035482/