Node.js 继续迁移
我是Sequelize新手,想知道是否有人知道在使用迁移功能时,Sequelize中是否有避免代码重复的方法 我的意思是,在迁移过程中,您会遇到如下情况:Node.js 继续迁移,node.js,sequelize.js,Node.js,Sequelize.js,我是Sequelize新手,想知道是否有人知道在使用迁移功能时,Sequelize中是否有避免代码重复的方法 我的意思是,在迁移过程中,您会遇到如下情况: //migration-xyz.js module.exports = { up: function(migration, DataTypes, done) { migration.createTable('Users', { name: DataTypes.STRING, s
//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;
};
但是这个模型看起来是这样的:
//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;
};
有没有办法消除代码重复
谢谢你的帮助!:) 正如@WiredPairie在其评论中提到的,迁移和模型上的属性是截然不同的。我们通常会创建一个具有特定属性的模型,并通过相关迁移来创建相应的表。稍后将向模型添加更多属性,我们需要创建一个迁移,只为新属性添加列 消除重复的一种方法是使用从模型文件创建数据库的
sequelize.sync
。但这也有缺点,不应用于部署在不同环境中的复杂应用程序
可能在将来,sequelize cli将有一个
create:migration--model[modelfile]
选项,用于为相应的模型创建表。这将有相同的代码“重复”,但会使事情更快一些 最初通过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;
};
在模型目录中,当您
要求(“/型号”)
因此,我使用以下代码为该版本的迁移导入了新模型:
//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});
}
};
他们在做完全不同的事情。随着迁移的增多,最终的
用户
模型的用途就不那么明显了。我希望用户
类有一个真实来源,而不是查看许多迁移来发现其属性。感谢您的评论,我同意应该有一个真实来源。然而,一个具有DB模式的模型文件和许多迁移以及DB模式更改并没有使事情变得更“真实”,相反,它使事情变得更加混乱。因此,我的问题是,有没有办法消除重复?什么样的重复?如果您有10个迁移文件,它们都修改了user
表,那么您在应用程序代码中使用的模式是什么样的?迁移甚至不需要驻留在同一个源存储库中,除非您专门执行它们,否则它们不会执行。这里也有同样的问题,我想使用迁移创建表并保留更改记录。迁移应该(更好)在我们定义模型更改时自动生成,比如south(django)。动态地将初始迁移内容调整到模型的当前状态的目的是什么?这没有任何意义。迁移应该是一个静态补丁。