使用SeqelizeJS编写与外键迁移

的背景

我正在用SequelizeJS构build一个受欢迎的NodeJS ORM项目。 在devise一个模式时,似乎有两种风格:

  1. 创build模型代码并使用.sync()函数为模型自动生成表格。
  2. 创build模型代码并使用QueryInterface和umzug编写手动迁移 。

我的理解是,#1对于快速原型devise来说更好,但对于期望随着时间的推移,生产数据需要能够经历迁移的项目而言,#2是最佳实践。

这个问题涉及策略#2。

问题(S)

我的表具有必须通过外键反映的关系。

  • 如何通过Sequelize QueryInterface创build具有外键关系的表格?

  • sequelize需要哪些列和帮助表? 例如,看起来像createdAt或updatedAt这样的特定列是预期的。

如何通过Sequelize QueryInterface创build具有外键关系的表格?

.createTable()方法接收一列字典。 您可以在.define()的文档中看到有效属性列表,具体方法是查看params表中的[attributes.column.*]行。

要创build具有外键关系的属性,请使用“references”和“referencesKey”字段:

例如,以下内容将创build一个users表和一个引用用户表的user_emails表。

 queryInterface.createTable('users', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true } }).then(function() { queryInterface.createTable('user_emails', { userId: { type: Sequelize.INTEGER, references: { model: 'users', key: 'id' } } }) }); 

sequelize需要哪些列和帮助表? 例如,看起来像createdAt或updatedAt这样的特定列是预期的。

看起来,标准模型将为每个表预期一个idupdatedAtupdatedAt列。

 queryInterface.createTable('users', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, createdAt: { type: Sequelize.DATE }, updatedAt: { type: Sequelize.DATE } } 

如果你有偏执:在你的模型上设置true,你还需要一个deletedAt时间戳。

我想提供另一个更手动的select,因为当使用手动迁移和queryInterface我碰到以下问题:我有2个文件在迁移文件夹像这样

 migrations/create-project.js migrations/create-projectType.js 

因为projectprojectTypeId列引用的projectType ,由于文件的顺序,它没有创build,这是导致错误。

我在创build两个表之后通过添加外键约束来解决这个问题。 在我的情况下,我决定写在create-projectType.js

 queryInterface.createTable('project_type', { // table attributes ... }) .then(() => queryInterface.addConstraint('project', ['projectTypeId'], { type: 'FOREIGN KEY', name: 'FK_projectType_project', // useful if using queryInterface.removeConstraint references: { table: 'project_type', field: 'id', }, onDelete: 'no action', onUpdate: 'no action', }))