我有一套Sequelize模型。我想使用迁移,而不是DB Sync。
根据{{3}},Sequelize CLI似乎能够做到这一点: “当您使用CLI进行模型生成时,您也将免费获得迁移脚本。”
如何使用现有Sequelize模型中的Sequelize CLI自动生成迁移?
答案 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
外键约束(甚至互惠(用户所属团队,团队属于用户作为所有者))
包含name
,method
和unique
属性的索引
答案 4 :(得分:4)
虽然它不会自动生成,但是对模型更改生成新迁移的一种方法是: (假设您正在使用库存sequelize-cli文件结构,其中迁移和模型处于同一级别)
(与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');
}
};
对用户模型进行更改。
sequelize db:migrate:undo:all
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(或某些源代码管理)和数据库备份,以便在出现严重问题时可以撤消这些更改。
.sync()
yarn db:makemigrations --name "mega-migration"
)中的所有内容。01-mega-migration.js
和生成的_current.json
。.sync()
或手写迁移,则需要通过将其名称插入SequelizeMeta表中来“伪造”该大型迁移。插入SequelizeMeta值('01 -mega-migration.js')。$ yarn db:makemigrations --name whatever
02-whatever.js
迁移以及对_current.json
和_current.bak.json
的更改。$ yarn sequelize db:migrate
。重命名一列将变成一对removeColumn
和addColumn
。这将丢失生产中的数据。您将需要修改向上和向下操作以改为使用renameColumn
。
如果您进行了大量迁移,则down操作可能无法以顺序一致的方式完美地删除项目。
此库的维护者未主动对其进行检查。因此,如果开箱即用对您不起作用,则需要找到其他社区分支或其他解决方案。
答案 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