关联迁移

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

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

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

情况1:数据库初始化

如果您的目的是在数据库结构的初始化过程中添加关系,最好使用sync方法,而不是使用迁移手动添加它们。 如果您的模型devise正确并且已经定义了关系,那么在执行sync方法时将自动创build它们。

看看后续的例子 。 在模型目录中,您有三个文件:

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

查看task.js内容,从第7行开始,下面的代码创buildUser和Task模型之间的关系:

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

如果您在模型文件中正确准备好关系,则同步将为您创build外键。 在这种情况下迁移不是必要的。

我鼓励你阅读整个express-example readme.md并浏览存储库文件,看看这些东西是如何工作的,快递和续集。

情况2:数据库结构迁移

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

你可以阅读关于在sequelize文档中的基本迁移 。 不幸的是,文档不包括创build关系。 假设您要创build以下关系:用户属于组。 要在关系的用户端创build列,可以使用addColumn方法。

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

不幸的是没有一个很好的函数(但是)为你创build外键约束,但你可以使用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;"); 

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

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

显然这不是真正的常见方式,但对我来说似乎更合乎逻辑。 如果您只想使用迁移,则必须使用SQL查询来创build初始迁移。

这里是这个post: 第一个 ,受这个启发。

但无论如何,我认为ezrepotein是正确的创build与同步的初始数据库,然后迁移。 这似乎比使用umzug更容易,只使用迁移。

您可以添加对迁移的引用

〔实施例:

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

只要确保你所引用的模型存在。