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

我有一套 Sequelize 模型。我想使用迁移,而不是数据库同步。

序列化 CLI 似乎可以做到这一点,根据 这篇文章: “当您使用 CLI 生成模型时,您还将免费获得迁移脚本。”

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

202373 次浏览

我最近尝试了下面的方法,看起来效果不错,尽管我不能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)

所有的表都在那里,一切(至少看起来)都按预期运行。如果定义正确,甚至所有的关联都存在。

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

  1. (Same as Manuel Bieh's suggestion, but using a require instead of an import) In your migration file (if you don't have one, you can generate one by doing "sequelize migration:create") have the following code:

    '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. Make a change to the User model.

  3. Delete table from database.
  4. Undo all migrations: sequelize db:migrate:undo:all
  5. Re-migrate to have changes saved in db. sequelize db:migrate

我创建了一个小的工作“迁移文件生成器”。它使用 sequelize db:migrate创建工作正常的文件-甚至使用外键!

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

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

  • 字符串、文本、 ENUM、整数、布尔值、浮点数作为数据类型

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

  • 具有 namemethodunique属性的索引

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

sequelize migration:generate --name [name_of_your_migration]

This will generate a blank skeleton migration file. While it doesn't copy your model structure over to the file, I do find it easier and cleaner than regenerating everything. Note: make sure to run the command from the containing directory of your migrations directory; otherwise the CLI will generate a new migration dir for you

您现在可以使用 npm 包 Sequelize-auto- 自動產生一個迁移文件

使用 Sequelize-cli 初始化项目

sequelize init

创建您的模型并将它们放在您的模型文件夹中。

Install sequelize-auto-migrations:

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

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

Another solution is to put data definition into a separate file.

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

为了不让这篇文章充斥着大量的代码,我写了一个 GitHub 的要点。

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

It's 2020 and many of these answers no longer apply to the Sequelize v4/v5/v6 ecosystem.

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

Setup

我的团队使用 sequelize-auto-migrations分叉,因为原来的回购是没有被合并的几个关键公关。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. Delete all old migrations if any exist.
  2. Turn off .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. Run your migration through the normal sequelize-cli: $ yarn sequelize db:migrate.
  11. 必要时重复7-10

已知的陷阱

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

对于那些不知道如何使用 renameColumn的人来说,代码片段如下所示。(为 rollbackCommands切换“ column _ name _ before”和“ column _ name _ after”)

{
fn: "renameColumn",
params: [
"table_name",
"column_name_before",
"column_name_after",
{
transaction: transaction
}
]
}
  1. 如果您有大量的迁移,down 操作可能不会以一致的顺序完美地删除项目。

  2. 此库的维护人员不会主动检查它。因此,如果它不适合您开箱即用,您将需要找到一个不同的社区分支或另一个解决方案。

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

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

它用于创建具有下划线的列,如:-create _ at、 update _ at 或任何其他具有下划线的列,并支持具有下划线的用户定义列。

截至2020年9月16日,这些答案大多数都不太一致! Try this new npm package

Sequelize-mig

它完成了大多数已知的序列化问题——自动迁移及其分支以及它的维护和文档化!

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

Install:

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

然后像这样使用它

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

PaulMest 在这一页的回答对我来说非常有用。 I used 'sequelize-auto-migrations' but it did not detect my changes. 我使用的是‘ Sequelize-auto-miations-v2’,这对我来说是正确的。 You can install it by:

npm install sequelize-auto-migrations-v2

使用方法:

node ./node_modules/sequelize-auto-migrations-v2/bin/makemigration