如何使用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

  • 外键约束(即使是相互的(用户属于团队,团队属于用户为所有者))

  • 索引与namemethodunique属性

我最近尝试了下面的方法,似乎工作正常,但我不是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文件结构)

  1. (与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'); } }; 
  2. 对用户模型进行更改。

  3. 从数据库中删除表。
  4. 撤销所有迁移: sequelize db:migrate:undo:all
  5. 重新迁移以保存在数据库中的更改。 sequelize db:migrate