首页 文章

如何使用Sequelize模型中的Sequelize CLI自动生成迁移?

提问于
浏览
42

我有一套Sequelize模型 . 我想使用迁移,而不是DB Sync .

根据this articleSequelize CLI似乎能够做到这一点:"When you use the CLI for the model generation, you will gain the migration scripts for free as well."

如何使用现有Sequelize模型中的Sequelize CLI自动生成迁移?

7 回答

  • 26

    我最近尝试了以下方法似乎工作正常,虽然我不是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 运行上面的迁移时,我的控制台说:

    Starting 'db:migrate'...
    Finished 'db:migrate' after 91 ms
    == 20160113121833-create-tables: migrating =======
    == 20160113121833-create-tables: migrated (0.518s)
    

    所有表都在那里,一切(至少看起来)都按预期工作 . 如果正确定义,即使所有关联都在那里 .

  • 0

    另一种解决方案是将数据定义放入单独的文件中 .

    我们的想法是将模型和迁移的通用数据写入单独的文件,然后在迁移和模型中都需要它 . 然后在模型中我们可以添加验证,而迁移已经很好了 .

    为了不用大量的代码弄乱这篇文章我写了一个GitHub的要点 .

    在这里看到:https://gist.github.com/igorvolnyi/f7989fc64006941a7d7a1a9d5e61be47

  • 13

    您无法为现有模型创建迁移脚本 .

    资源:

    如果采用经典方式,则必须通过CLI重新创建模型:

    sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text
    

    它会生成这些文件:

    models/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;
    };
    

    migrations/20150210104840-create-my-user.js:

    "use strict";
    module.exports = {
      up: function(migration, DataTypes, done) {
        migration.createTable("MyUsers", {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
          },
          first_name: {
            type: DataTypes.STRING
          },
          last_name: {
            type: DataTypes.STRING
          },
          bio: {
            type: DataTypes.TEXT
          },
          createdAt: {
            allowNull: false,
            type: DataTypes.DATE
          },
          updatedAt: {
            allowNull: false,
            type: DataTypes.DATE
          }
        }).done(done);
      },
      down: function(migration, DataTypes, done) {
        migration.dropTable("MyUsers").done(done);
      }
    };
    
  • 4

    您现在可以使用npm包sequelize-auto-migrations自动生成迁移文件 . https://www.npmjs.com/package/sequelize-auto-migrations

    使用sequelize-cli,用你的项目初始化

    sequelize init
    

    创建模型并将其放入模型文件夹中 .

    安装sequelize-auto-migration:

    npm install sequelize-auto-migrations
    

    使用创建初始迁移文件

    node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>
    

    运行迁移:

    node ./node_modules/sequelize-auto-migrations/bin/runmigration
    

    您还可以从现有数据库自动生成模型,但这超出了问题的范围 .

  • 10

    如果您不想从头开始重新创建模型,可以使用以下CLI命令手动生成迁移文件:

    sequelize migration:generate --name [name_of_your_migration]

    这将生成一个空白的框架迁移文件 . 虽然它不会将模型结构复制到文件中,但我发现它比重新生成所有内容更容易,更清晰 . 注意:确保从迁移目录的包含目录运行该命令;否则CLI将为您生成新的迁移目录

  • 5

    我创建了一个小工作"migration file generator" . 它使用 sequelize db:migrate 创建完美正常的文件 - 即使使用外键!

    你可以在这里找到它:https://gist.github.com/manuelbieh/ae3b028286db10770c81

    我在一个包含12种不同型号的应用程序中进行了测试:

    • STRING,TEXT,ENUM,INTEGER,BOOLEAN,FLOAT作为DataTypes

    • 外键约束(甚至互惠(用户所属于团队,团队属于用户作为所有者))

    • 索引包含 namemethodunique 属性

  • 0

    虽然它不会自动生成,但是对模型更改生成新迁移的一种方法是:(假设您正在使用库存sequelize-cli文件结构,其中迁移和模型位于同一级别)

    • (与Manuel Bieh 's suggestion, but using a require instead of an import) In your migration file (if you don'有一个,你可以通过做“ 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

    • 重新迁移以在db中保存更改 . sequelize db:migrate

相关问题