我有一组Sequelize模型。我想使用迁移,而不是DB Sync。
Sequelize CLI似乎可以做到这一点,根据这篇文章: “当你使用CLI生成模型时,你也将免费获得迁移脚本。”
如何使用Sequelize CLI从现有的Sequelize模型自动生成迁移?
我有一组Sequelize模型。我想使用迁移,而不是DB Sync。
Sequelize CLI似乎可以做到这一点,根据这篇文章: “当你使用CLI生成模型时,你也将免费获得迁移脚本。”
如何使用Sequelize CLI从现有的Sequelize模型自动生成迁移?
如果您不想从头开始重新创建模型,您可以使用以下CLI命令手动生成迁移文件:
sequelize migration:generate --name [name_of_your_migration]
这将生成一个空白的骨架迁移文件。虽然它不会复制您的模型结构到文件中,但我发现它比重新生成所有东西更容易和清晰。请注意:一定要从包含迁移目录的目录中运行该命令;否则,CLI将为您生成一个新的迁移目录。
npx sequelize-cli migration:generate --name [name_of_your_migration]
。但在此之前,您需要告诉 sequelize-cli 生成迁移文件的位置,sequelize-cli 使用名为 migrations-path
的配置项来指定该位置。参考链接:https://sequelize.org/master/manual/migrations.html#the--code--sequelizerc--code--file - Sento现在是2023年,这些回答已经不适用于Sequelize v4/v5/v6生态系统。
其中一个好的答案是使用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(或一些源控制)和数据库备份,以便在出现严重问题时可以撤消这些更改。
.sync()
。yarn db:makemigrations --name "mega-migration"
)。01-mega-migration.js
以及生成的 _current.json
。.sync()
或手写迁移,则需要“伪造”该超级迁移,方法是在您的 SequelizeMeta 表中插入其名称。 INSERT INTO SequelizeMeta Values ('01-mega-migration.js')
。$ yarn db:makemigrations --name whatever
02-whatever.js
迁移以及对 _current.json
和 _current.bak.json
的更改。$ yarn sequelize db:migrate
。removeColumn
和 addColumn
。这将在生产中丢失数据。您需要修改上下行操作,改用 renameColumn
。对于那些不知道如何使用
renameColumn
的人,代码段应如下所示。(为rollbackCommands
切换“column_name_before”和“column_name_after”)
{
fn: "renameColumn",
params: [
"table_name",
"column_name_before",
"column_name_after",
{
transaction: transaction
}
]
}
如果你有大量的迁移,向下操作可能无法以一致的方式按顺序完全删除项目。
此库的维护者不会主动检查它。因此,如果它不能直接为您工作,则需要找到一个不同的社区分支或另一个解决方案。
--name
选项了。它是可选的。这样它就会创建 01-noname.js
... 然后你可以手动重命名这个文件。 - PaulMest无法为现有模型创建迁移脚本。
资源:
如果按传统方式进行,您需要通过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);
}
};
stukko addMigration
时)。 - sebastien.b现在,您可以使用npm软件包sequelize-auto-migrations自动生成迁移文件。 https://www.npmjs.com/package/sequelize-auto-migrations
使用sequelize-cli,通过以下命令初始化您的项目:
sequelize init
在你的models文件夹中创建你的模型。安装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
您还可以从现有数据库自动生成模型,但这超出了本问题的范围。
截至2020年9月16日,这些答案大多不太一致!尝试使用这个新的npm包。
Sequelize-mig
它已经解决了sequelize-auto-migrations及其派生项目中大部分已知的问题,并得到了维护和文档记录!
它的使用方式类似于已知的方式。
安装:
npm install sequelize-mig -g / yarn global add sequelize-mig
然后像这样使用它
sequelize-mig migration:make -n <migration name>
我创建了一个小型的“迁移文件生成器”,它可以创建文件,这些文件可以使用sequelize db:migrate
进行完美工作,甚至包括外键!
你可以在这里找到它:https://gist.github.com/manuelbieh/ae3b028286db10770c81
我在一个应用程序中测试了它,该应用程序涵盖了12个不同的模型,包括:
STRING、TEXT、ENUM、INTEGER、BOOLEAN、FLOAT等数据类型
带有外键约束(甚至是相互的(用户属于团队,团队属于用户作为所有者))
具有name
、method
和unique
属性的索引
如果您想创建模型并进行迁移,请使用以下命令:
sequelize model:create --name regions --attributes name:string,status:boolean --underscored
--underscored 用于创建具有下划线的列,例如:created_at、updated_at 或任何其他支持用户自定义下划线的列。
虽然它不会自动生成,但生成新的迁移文件以响应模型更改的一种方法是: (假设您使用的是标准的sequelize-cli文件结构,其中迁移和模型位于同一级别)
(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');
}
};
Make a change to the User model.
sequelize db:migrate:undo:all
sequelize db:migrate
models.sequelize.sync({force: true})
做了类似的事情(只是稍微复杂一些)。如果你更改了模型,就没有办法更新你的模式,因为迁移已经运行过了(这就是为什么你要使用 db:migrate:undo:all
)。迁移应该对你的数据库模式进行版本控制。这是一个不错的例子(我学到了一些命令),但我不会在 生产环境
中使用它。 - czerasz我最近尝试了以下方法,似乎运行良好,但我不能百分之百确定是否会有任何副作用:
'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)
所有的表格都在那里,一切(至少看起来是)按预期工作。即使所有关联都在那里,如果它们被正确定义的话。
./tmp
文件夹中)生成静态迁移文件:https://gist.github.com/manuelbieh/606710b003b5fe448100 - 正如我之前所述:我不知道是否有任何负面影响,因此请谨慎使用! - Manuel Bieh这个页面上的PaulMest的回答对我非常有用。 我使用了“sequelize-auto-migrations”,但它没有检测到我的更改。 我使用了“sequelize-auto-migrations-v2”,这对我来说是正确的。 您可以通过以下方式安装:
npm install sequelize-auto-migrations-v2
并通过以下方式使用:
node ./node_modules/sequelize-auto-migrations-v2/bin/makemigration