Sequelize迁移中的关联

loi*_*cs2 17 associations database-migration node.js sequelize.js

我的应用程序当前使用Sequelize sync()方法来创建数据库,我想将其更改为使用迁移系统.

我的一个模型belongsTo()与其他模型有关联,我真的不知道如何为这些关联制作初始迁移代码.

我是否必须使用SQL查询手动创建外键,或者是否有一些方法可用?

ezp*_*zpn 14

案例1:数据库初始化

如果您的目的是在数据库结构初始化期间添加关系,最好只使用sync方法而不是使用迁移手动添加它们.如果您的模型设计合理且定义了关系,则会在执行sync方法时自动创建它们.

看看sequelize express示例.在models目录中,您有三个文件:

  • index.js - 包括所有型号
  • task.js - 任务模型
  • user.js - 用户模型

查看task.js内容,从第7行开始,以下代码在User和Task模型之间创建关系:

classMethods: {
  associate: function(models) {
    Task.belongsTo(models.User, {
      onDelete: "CASCADE",
      foreignKey: {
        allowNull: false
      }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您在模型文件中正确准备关系,则sync将为您创建外键.在这种情况下,迁移不是必需的.

我鼓励您阅读整个快速示例readme.md并浏览存储库文件,以了解这些内容如何使用express和sequelize.

案例2:数据库结构迁移

如果您已经拥有一些要保留的数据,则需要使用迁移脚本,因为同步重构数据库的唯一方法是将其与所有数据一起完全销毁.

您可以在续集文档中阅读有关基本迁移的内容.不幸的是,文档不包括创建关系.假设您要创建以下关系:用户属于组.要在关系的用户端创建列,您可以使用addColumn方法.

queryInterface.addColumn(
  'user',
  'group_id',
  {
    type: Sequelize.INTEGER,
    allowNull: true
  }
)
Run Code Online (Sandbox Code Playgroud)

不幸的是,还没有一个很好的功能(还)为你创建外键约束,但你可以使用sequelize查询方法手动完成.Postgresql示例:

queryInterface.sequelize.query("ALTER TABLE user
  ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id)
  REFERENCES group (id) MATCH SIMPLE
  ON UPDATE CASCADE ON DELETE CASCADE;");
Run Code Online (Sandbox Code Playgroud)

编辑:添加了数据库结构迁移案例

  • Sync根据您当前的模型创建一个干净的数据库结构.如果force属性设置为false,则只会创建数据库(如果尚不存在).否则,每次重新启动服务器时都会擦除整个数据库.迁移脚本用于通过对现有结构和数据进行操作来更改现有数据库.它在您希望在更新之间保留数据的生产环境中非常有用. (2认同)
  • 否决投票,因为问题特别是关于迁移(您需要用于生产),而这个答案并没有回答这个问题。(但对`sync` 的回答很好)。 (2认同)
  • 自 2017 年 5 月起,您可以在迁移中创建外键约束。请参阅此处:https://github.com/sequelize/cli/issues/239#issuecomment-166564364 (2认同)

小智 6

将其添加为答案,而不是上面@ aryeh-armon答案的注释(代表不足够)。需要确保表名称而不是模型名称。即,如果您的模型名为Job,而数据库表名为Jobs,则迁移将看起来像这样。

jobId: {
type: Sequelize.INTEGER,
references: {
    model: "Jobs",
    key: "id"
  }
},
Run Code Online (Sandbox Code Playgroud)