Sequelize迁移中的关联

时间:2015-10-27 20:16:52

标签: node.js associations database-migration sequelize.js

我的应用目前使用Sequelize belongsTo()方法创建数据库,我想将其更改为使用迁移系统。

我的一个模型与其他模型有resources :goals个关联,我真的不知道如何为这些关联制作初始迁移代码。

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

4 个答案:

答案 0 :(得分:12)

案例1:数据库初始化

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

看看sequelize express example。在models目录中,您有三个文件:

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

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

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

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

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

案例2:数据库结构迁移

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

您可以阅读有关基本migrations in the sequelize docs的内容。不幸的是,文档不包括创建关系。假设您要创建以下关系:用户属于组。要在关系的用户端创建列,您可以使用addColumn方法。

queryInterface.addColumn(
  'user',
  'group_id',
  {
    type: Sequelize.INTEGER,
    allowNull: true
  }
)

不幸的是,为你创建外键约束还没有很好的功能,但你可以使用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;");

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

答案 1 :(得分:2)

经过大量搜索后,我发现了一些博客文章,解释了我想要做的事情。

显然,这并不是常见的做法,但对我来说似乎更合乎逻辑。如果只想使用迁移,则必须使用SQL查询来创建初始迁移。

以下是帖子:the first one,灵感来自this one

但无论如何,我认为ezrepotein对于使用sync创建初始数据库是正确的,然后进行迁移。它似乎比使用umzug更容易,只使用迁移。

答案 2 :(得分:2)

为上面的@ aryeh-armon回答添加这个作为答案而不是评论(不够代表)。它是确保存在而不是模型名称所需的表名。即如果您的模型名为Job并且您的db表名为Jobs,那么迁移看起来就像这样。

Col

答案 3 :(得分:0)

您可以添加对迁移的引用

〔实施例:

user_id: {
    type: Sequelize.BIGINT,
    references: {
        model: "users",
        key: "id"
    }
},

只需确保您引用的模型存在。