我是Sequelize的新手,想知道是否有人知道在使用迁移功能时是否有办法避免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;
};
有没有办法摆脱代码重复?
感谢您的帮助! :)
答案 0 :(得分:1)
正如@WiredPrairie在他/她的评论中引用的那样,迁移和模型上的属性是不同的东西。通常,我们将创建具有某些属性的模型以及相关的迁移来创建相应的表。稍后将在模型中添加更多属性,我们将需要创建一个仅为新属性添加列的迁移。
删除重复的方法是使用sequelize.sync
从模型文件创建数据库。这有缺点,不应该用于在不同环境中部署的复杂应用程序。
将来sequelize-cli可能会有一个create:migration --model [modelfile]
选项,它会为相应的模型创建表格。这将具有相同的“重复”代码,但会使事情变得更快。
答案 1 :(得分:-1)
当您最初通过sequelize-cli
运行迁移时它将文件夹结构设置为:
-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});
}
};