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

时间:2015-01-08 08:28:55

标签: mysql node.js orm sequelize.js

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

根据{{​​3}},

Sequelize CLI似乎能够做到这一点: “当您使用CLI进行模型生成时,您也将免费获得迁移脚本。”

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

10 个答案:

答案 0 :(得分:27)

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

资源:

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

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

<强>迁移/ 20150210104840创建-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);
  }
};

答案 1 :(得分:16)

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

sequelize migration:generate --name [name_of_your_migration]

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

答案 2 :(得分:14)

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

使用sequelize-cli,使用

初始化项目
npm install sequelize-auto-migrations

创建模型并将它们放入模型文件夹中。

安装sequelize-auto-migrations:

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

使用

创建初始迁移文件
node ./node_modules/sequelize-auto-migrations/bin/runmigration

运行迁移:

{{1}}

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

答案 3 :(得分:5)

我创建了一个小型的“迁移文件生成器”。它使用sequelize db:migrate创建完全正常的文件 - 即使使用外键!

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

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

  • STRING,TEXT,ENUM,INTEGER,BOOLEAN,FLOAT as DataTypes

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

  • 包含namemethodunique属性的索引

答案 4 :(得分:4)

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

  1. (与Manuel Bieh的建议相同,但使用require而不是导入)在您的迁移文件中(如果您没有,可以通过执行&#34生成一个) ; sequelize migration:create&#34;)具有以下代码:

    '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. 重新迁移以在db中保存更改。 sequelize db:migrate

答案 5 :(得分:3)

快到2020年了,其中许多答案不再适用于Sequelize v4 / v5生态系统。

一个不错的答案是说要使用sequelize-auto-migrations,但可能说明性不足以在您的项目中使用。所以这里还有更多颜色...

设置

我的团队使用sequelize-auto-migrations的分支,因为原始存储库尚未合并几个关键PR。 #56 #57 #58 #59

$ yarn add github:scimonster/sequelize-auto-migrations#a063aa6535a3f580623581bf866cef2d609531ba

编辑package.json:

"scripts": {
  ...
  "db:makemigrations": "./node_modules/sequelize-auto-migrations/bin/makemigration.js",
  ...
}

过程

注意:请确保您使用的是git(或某些源代码管理)和数据库备份,以便在出现严重问题时可以撤消这些更改。

  1. 删除所有旧迁移(如果有的话)。
  2. 关闭.sync()
  3. 创建一个大型迁移,以迁移当前模型(yarn db:makemigrations --name "mega-migration")中的所有内容。
  4. 提交您的01-mega-migration.js和生成的_current.json
  5. 如果您以前运行过.sync()或手写迁移,则需要通过将其名称插入SequelizeMeta表中来“伪造”该大型迁移。插入SequelizeMeta值('01 -mega-migration.js')。
  6. 现在您应该可以正常使用它了……
  7. 对模型进行更改(添加/删除列,更改约束)
  8. 运行$ yarn db:makemigrations --name whatever
  9. 提交您的02-whatever.js迁移以及对_current.json_current.bak.json的更改。
  10. 通过正常的sequelize-cli运行迁移:$ yarn sequelize db:migrate
  11. 必要时重复7-10次

已知的陷阱

  1. 重命名一列将变成一对removeColumnaddColumn。这将丢失生产中的数据。您将需要修改向上和向下操作以改为使用renameColumn

  2. 如果您进行了大量迁移,则down操作可能无法以顺序一致的方式完美地删除项目。

  3. 此库的维护者未主动对其进行检查。因此,如果开箱即用对您不起作用,则需要找到其他社区分支或其他解决方案。

答案 6 :(得分:2)

截至2020年9月16日,这些答案大多数都不太一致! 试试这个新的npm包

Sequelize-mig

它完成了sequelize-auto-migrations和其fork以及维护和记录中的最著名的问题!

它的使用方式类似于已知的

安装:

npm install sequelize-mig -g / yarn global add sequelize-mig

然后像这样使用它

sequelize-mig migration:make -n <migration name>

答案 7 :(得分:1)

如果要与迁移一起创建模型,请使用以下命令:-

sequelize model:create --name regions --attributes name:string,status:boolean --underscored

-下划线,用于创建具有下划线的列,例如:-created_at,updated_at或任何其他具有下划线的列,并支持用户定义的具有下划线的列。

答案 8 :(得分:0)

我最近尝试了以下方法似乎工作正常,但我不能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)

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

答案 9 :(得分:0)

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

这个想法是将模型和迁移共同的数据写入一个单独的文件,然后在迁移和模型中都需要它。然后,在模型中,我们可以添加验证,而迁移已经可以进行了。

为了不使这篇文章充满大量代码,我写了一个GitHub要点。

在此处查看:https://gist.github.com/igorvolnyi/f7989fc64006941a7d7a1a9d5e61be47