续集 ORM:在连接表上使用可延期约束



我正在尝试使用与Sequelize的Many:Many关联(针对Postgre db(。

我想创建一个场所,并在单个事务中将其与用户关联。场地和用户设置为普通的续集模型,并通过连接表"userVenue"将每个设置为另一个的"属于多个"。

问题是我似乎无法在同一事务中创建新场所及其第一个用户关联。Postgre 抛出以下错误:

insert or update on table "userVenues" violates foreign key constraint "userVenues_venueId_fkey"

由于新场地尚未投入使用。

我想我需要根据 Sequelize 文档将"userVenues"交汇表中"userId"和"venueId"的外键约束设置为最初可延迟,但是,由于 Sequelize 正在自动定义联结表的"userId"和"venueId",我不知道如何将它们设置为INITIALLY_DEFERRABLE。

我尝试简单地将事务设置为 SET_DEFERRED(根据同一文档(,我可以在日志中看到它确实向数据库发出命令"设置所有延迟约束",但是由于 Sequelize 似乎默认约束为 NOT(可延期(我仍然失败并出现相同的错误。如果我不使用事务,两个顺序插入就可以了。

有没有办法将这些外键定义为可延迟的?还是我以错误的方式接近这一点?

非常感谢!

相关代码如下:

// *** 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 中的一个错误

虽然它已被标记为错误,但尚未修复。一位有用的用户在该线程中回复了我的帖子,并提供了潜在的修复程序,但目前没有拉取请求。

如果有人觉得有帮助,我当前使用的解决方法是在数据库同步后运行此原始查询以更改约束。它确实需要了解约束名称。

await sequelize.query(
'ALTER TABLE "userVenues" ALTER CONSTRAINT "userVenues_venueId_fkey" DEFERRABLE INITIALLY DEFERRED'
);

最新更新