如何使用Sequelize模型自动生成Sequelize CLI迁移?
我有一套Sequelize模型。 我想使用迁移,而不是数据库同步。
Sequelize CLI似乎能够做到这一点,根据这篇文章 :“当您使用CLI生成模型时,您也将获得免费的迁移脚本。”
如何从现有的Sequelize模型中使用Sequelize CLI自动生成迁移?
您无法为现有模型创build迁移脚本。
资源:
- 关于迁移的教程video 。
- 链接到一个可能的解决方法
如果采用经典的方式,您将不得不通过CLI重新创build模型:
sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text
它会生成这些文件:
车型/ myuser.js:
"use strict"; module.exports = function(sequelize, DataTypes) { var MyUser = sequelize.define("MyUser", { first_name: DataTypes.STRING, last_name: DataTypes.STRING, bio: DataTypes.TEXT }, { classMethods: { associate: function(models) { // associations can be defined here } } }); return MyUser; };
我创build了一个小型的“迁移文件生成器”。 它使用sequelize db:migrate
创build完美工作的文件sequelize db:migrate
– 即使使用外键!
你可以在这里find它: https : //gist.github.com/manuelbieh/ae3b028286db10770c81
我在一个包含12个不同模型的应用程序中testing它:
-
STRING,TEXT,ENUM,INTEGER,BOOLEAN,FLOAT作为数据types
-
外键约束(即使是相互的(用户属于团队,团队属于用户为所有者))
-
索引与
name
,method
和unique
属性
我最近尝试了下面的方法,似乎工作正常,但我不是100%确定是否可能有任何副作用:
'use strict'; import * as models from "../../models"; module.exports = { up: function (queryInterface, Sequelize) { return queryInterface.createTable(models.Role.tableName, models.Role.attributes) .then(() => queryInterface.createTable(models.Team.tableName, models.Team.attributes)) .then(() => queryInterface.createTable(models.User.tableName, models.User.attributes)) }, down: function (queryInterface, Sequelize) { ... } };
当使用sequelize db:migrate
运行上面的sequelize db:migrate
,我的控制台说:
Starting 'db:migrate'... Finished 'db:migrate' after 91 ms == 20160113121833-create-tables: migrating ======= == 20160113121833-create-tables: migrated (0.518s)
所有的桌子都在那里,一切(至less似乎)按预期工作。 即使所有的协会都在那里,如果他们被正确定义。
虽然不会自动生成,但是对模型更改生成新迁移的一种方法是:(假定您正在使用迁移和模型处于同一级别的stock sequelize-cli文件结构)
-
(与Manuel Bieh的build议相同,但是使用require而不是导入)在你的迁移文件中(如果你没有,你可以通过执行“
sequelize migration:create
”生成一个)具有以下代码:'use strict'; var models = require("../models/index.js") module.exports = { up: function(queryInterface, Sequelize) { return queryInterface.createTable(models.User.tableName, models.User.attributes); }, down: function(queryInterface, Sequelize) { return queryInterface.dropTable('Users'); } };
-
对用户模型进行更改。
- 从数据库中删除表。
- 撤销所有迁移:
sequelize db:migrate:undo:all
- 重新迁移以保存在数据库中的更改。
sequelize db:migrate