续集迁移

我是Sequelize的新手,想知道是否有人知道在使用迁移function时是否有办法避免Sequelize中的代码重复?

我的意思是在迁移中你会有这样的东西:

//migration-xyz.js module.exports = { up: function(migration, DataTypes, done) { migration.createTable('Users', { name: DataTypes.STRING, surname: DataTypes.STRING }); }, down: function(migration, DataTypes, done) { // logic for reverting the changes } } 

但是模型看起来像这样:

 //user.js module.exports = function(sequelize, DataTypes) { var User = sequelize.define('User', { name: DataTypes.STRING, surname: DataTypes.STRING }); return User; }; 

有没有办法摆脱代码重复?

谢谢您的帮助! 🙂

由于@WiredPrairie在他/她的评论中引用,迁移和模型上的属性是不同的东西。 通常我们将创build一个具有特定属性和关联迁移的模型,以创build相应的表。 稍后更多的属性将被添加到模型中,我们将需要创build一个迁移,为新的属性添加列。

删除重复的一种方法是使用sequelize.sync从模型文件中创build数据库。 尽pipe这不利于复杂的应用程序,但不应该在不同的环境中部署。

也许将来sequelize-cli会有一个create:migration --model [modelfile]选项,它将为相应的模型创build表格。 这将有相同的“重复”的代码,但会让事情快一点。

当你最初通过sequelize-cli运行迁移时

它build立了如下的文件夹结构:

 -config -config/config.json -migrations -models -models/index.js 

如果你确定你的模型文件:

 //user.js module.exports = function(sequelize, DataTypes) { var User = sequelize.define('User', { name: DataTypes.STRING, surname: DataTypes.STRING }); return User; }; 

在模型目录中,当你需要('./ models')时它会自动被拾取。

所以,我已经使用下面的代码来导入新版本的迁移版本:

 //migrations-xyz.js var Models = require('../models'); module.exports = { up: function (queryInterface, Sequelize) { /* Add altering commands here. Return a promise to correctly handle asynchronicity. Example: return queryInterface.createTable('users', { id: Sequelize.INTEGER}); */ var tables = _.map(Models.sequelize.models, function(def){ var model = Models[def], options = model.options, tableName = model.tableName, attributes = model.tableAttributes; return queryInterface.createTable(tableName, attributes, options); }); return Promise.all(tables); }, down: function (queryInterface, Sequelize) { /* Add reverting commands here. Return a promise to correctly handle asynchronicity. Example: return queryInterface.dropTable('users'); */ return Models.sequelize.drop({logging: true}); } };