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

Mic*_*idt 56 mysql orm node.js sequelize.js

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

根据这篇文章,Sequelize CLI似乎能够做到这一点:"当您使用CLI进行模型生成时,您也将免费获得迁移脚本."

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

Pau*_*est 42

现在是 2020 年,其中许多答案不再适用于 Sequelize v4/v5/v6 生态系统。

一个好的答案是使用sequelize-auto-migrations,但可能不够规范,无法在您的项目中使用。所以这里的颜色有点多……

设置

我的团队使用了一个fork,sequelize-auto-migrations因为原始 repo 还没有合并一些关键的 PR。#56 #57 #58 #59

$ yarn add github:scimonster/sequelize-auto-migrations#a063aa6535a3f580623581bf866cef2d609531ba
Run Code Online (Sandbox Code Playgroud)

编辑 package.json:

"scripts": {
  ...
  "db:makemigrations": "./node_modules/sequelize-auto-migrations/bin/makemigration.js",
  ...
}
Run Code Online (Sandbox Code Playgroud)

过程

注意:确保您正在使用 git(或某些源代码控制)和数据库备份,以便在出现问题时可以撤消这些更改。

  1. 删除所有旧迁移(如果存在)。
  2. 关掉 .sync()
  3. 创建一个大型迁移,迁移当前模型中的所有内容 ( yarn db:makemigrations --name "mega-migration")。
  4. 提交您的01-mega-migration.js_current.json生成的。
  5. 如果您以前运行过.sync()或手写迁移,则需要通过将其名称插入 SequelizeMeta 表来“伪造”该大型迁移。INSERT INTO SequelizeMeta Values ('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

对于那些对如何使用 感到困惑的人renameColumn,代码片段看起来像这样。(为 切换“column_name_before”和“column_name_after” rollbackCommands

{
    fn: "renameColumn",
    params: [
        "table_name",
        "column_name_before",
        "column_name_after",
        {
            transaction: transaction
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 如果您有大量迁移,则向下操作可能无法以一致的顺序完美删除项目。

  2. 这个库的维护者不会主动检查它。因此,如果开箱即用它对您不起作用,您将需要找到不同的社区分支或其他解决方案。


Dor*_*man 34

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

资源:

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

sequelize model:create --name MyUser --attributes first_name:string,last_name:string,bio:text
Run Code Online (Sandbox Code Playgroud)

它会生成这些文件:

车型/ 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;
};
Run Code Online (Sandbox Code Playgroud)

迁移/ 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);
  }
};
Run Code Online (Sandbox Code Playgroud)

  • 通常,您需要将同步功能(适用于新数据库或演示)以及迁移之间分开.当您拥有一个不断升级并且不想丢失数据的生产系统时,迁移可能是您唯一的选择.不幸的是,CLI仅适用于创建基本模板,它不运行任何特殊逻辑,也不扫描您的模型.(我也对此感到失望.)您需要创建迁移来转换架构/数据,并且需要将模型更改为代表最新架构,就好像它一直是这样. (11认同)
  • 感谢@Dor,但是编写更改的迁移脚本似乎需要很多工作。我希望以某种方式可以避免迁移脚本,并且默认情况下可以进行同步。 (3认同)
  • 谢谢@Dor 我对使用 sequelize 的同步功能有几个问题。据我了解,sequelize-cli 在内部使用 Umzug 进行所有迁移。您展示的示例确实帮助我入门,但是 Alter Table 的过程是什么,假设我想在 sequelize 中更改 MyUser 模型并让 sequelize cli 为我创建迁移脚本,sequelize cli 如何通过以下方式创建迁移脚本经历所有模型更改。 (2认同)
  • 谢谢@DorRotman - 我真的希望“你负责维护迁移文件和模型文件之间的一致性”在续集文档中得到明确解决,因为这是一个巨大的细节 (2认同)

joh*_*_mc 28

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

sequelize migration:generate --name [name_of_your_migration]

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

  • 这根本没有回答问题。它只是生成一个骨架,里面没有数据,这就是OP所要求的 (14认同)
  • 从来没有讨论过这一点,但是在进行迁移以添加或删除列时尤其需要,尤其是如果您希望稍后更新生产环境时。 (4认同)
  • 您可以从项目的根目录运行“npxsequelize-climigration:generate --name [name_of_your_migration]”。但在此之前,您需要告诉 *sequelize-cli* 在哪里生成迁移,*sequelize-cli* 为此使用名为“migrations-path”的配置。https://sequelize.org/master/manual/migrations.html#the--code--sequelizerc--code--file (4认同)
  • 谢谢,这真的很有用。不管怎样,如果我们能按照OP的要求去做就太好了。 (2认同)

Kal*_*ste 20

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

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

sequelize init
Run Code Online (Sandbox Code Playgroud)

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

安装sequelize-auto-migration:

npm install sequelize-auto-migrations
Run Code Online (Sandbox Code Playgroud)

使用创建初始迁移文件

node ./node_modules/sequelize-auto-migrations/bin/makemigration --name <initial_migration_name>
Run Code Online (Sandbox Code Playgroud)

运行迁移:

node ./node_modules/sequelize-auto-migrations/bin/runmigration
Run Code Online (Sandbox Code Playgroud)

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

  • 对我来说也不起作用。它使用我的表名生成一个迁移文件,但仅此而已:没有列,没有模式,什么也没有。 (2认同)

MRV*_*VMV 12

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

Sequelize-mig
Run Code Online (Sandbox Code Playgroud)

它完成了sequelize-auto-migrations及其分支中最已知的问题,并进行了维护和记录!

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

安装:

npm install sequelize-mig -g / yarn global add sequelize-mig
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

sequelize-mig migration:make -n <migration name>
Run Code Online (Sandbox Code Playgroud)


Man*_*ieh 6

我创建了一个小型的"迁移文件生成器".它使用sequelize db:migrate- 即使使用外键也能创建完美的文件!

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

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

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

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

  • 使用索引name,method以及unique性能

  • 只是为了给尝试该脚本的任何人提供注释,它仅适用于mysql (2认同)

Sha*_*dit 6

如果您想在迁移的同时创建模型,请使用以下命令:-

sequelize model:create --name regions --attributes name:string,status:boolean --underscored
Run Code Online (Sandbox Code Playgroud)

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