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

标签 node.js postgresql sequelize.js

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

相关文章:

node.js - 如何通过 Homebrew 软件安装 LTS 版本的 nodejs

node.js - 来自网络的文件的 node-sass 自定义导入器不起作用

sql - 如何在此查询中包含等于 0 的计数?

node.js - 如何在查询运行时将属性与 dynamodb 表 -> 项目 -> 属性中的小写值进行比较

Node.js/Express.js : Factory design pattern for DB queries

java - 复制到 * CSV 文件时数据不匹配

postgresql - AWS Arora Postgres Serverless 集群中的数据库名称

node.js - Sequelize.sync : Create indexes when table does not exist

node.js - 如何连接两个表? - 无法读取未定义的属性 'getTableName'

mysql - Sequelize bulkCreate : updateOnDuplicate