【问题标题】:What is the right approach of defining sequelize associations without using sequelize.sync?在不使用 sequelize.sync 的情况下定义 sequelize 关联的正确方法是什么?
【发布时间】:2021-07-17 00:46:51
【问题描述】:

项目: 语言:NodeJS, 数据库:Postgres, ORM:续集 v6

我已选择不使用 sequelize.sync。 相反,我使用迁移来创建/更新数据库模式。 我在模型定义文件中定义关联。 让我感到困惑的部分是模型创建迁移中的引用选项。 文档不清楚这个选项(以及没有sequelize.sync 的一般用例)。

主要问题是:

  1. 在我的特定用例中是否需要引用选项?
  2. 在我的特定用例中推荐使用引用选项吗?
  3. 在什么情况下我可能需要这个选项?
  4. 在我的特定用例中管理关联的正确方法是什么?

提前致谢

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    经过一些研究(使用不同方法观察数据库更改)、反复试验后,我发现仅使用 references 选项无法添加可配置约束(例如指定 onDelete 操作)。

    所以看来实现关联的正确方法如下: (注:不使用sequelize.sync

    1. 使用迁移创建table1
    2. 使用迁移创建 table2 - 不指定 references 选项
    3. table2 的迁移(创建)文件中添加以下代码(进行必要的更改)以添加外键约束
    await queryInterface.addConstraint('tableName', {
      fields: ['some-table2-field'],
      type: 'foreign key',
      references: {
        table: 'table1',
        field: 'table1Field',
      },
      onDelete: 'cascade',
      onUpdate: 'no action',
    });
    
    1. 按照通常的做法在 table1 和 table2 模型中定义关联,例如。
    // table1.model.js
    
    
    table1.hasMany(models.table2, {
        foreignKey: 'name-of-the-key',
        onDelete: 'cascade',
        onUpdate: 'no action',
    });
    
    
    // table2.model.js
    
    table2.belongsTo(models.table1, {
        foreignKey: 'name-of-the-key',
        onDelete: 'cascade',
        onUpdate: 'no action',
    });
    

    所以要回答我的问题 1-3:在使用 sequelize.sync 上的迁移时,您实际上不需要使用 references,而 4: 如上所述。

    如果其他人有更好或更正确的方法,欢迎回答和cmet。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多