gpt4 book ai didi

node.js - 续写 ORM : Using Deferrable constraints on junction table

转载 作者:行者123 更新时间:2023-12-03 22:34:55 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com