使用SeqelizeJS编写与外键迁移
的背景
我正在用SequelizeJS构build一个受欢迎的NodeJS ORM项目。 在devise一个模式时,似乎有两种风格:
- 创build模型代码并使用.sync()函数为模型自动生成表格。
- 创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这样的特定列是预期的。
看起来,标准模型将为每个表预期一个id
, updatedAt
和updatedAt
列。
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
因为project
有projectTypeId
列引用的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', }))