【问题标题】:Sequelize migrations续集迁移
【发布时间】:2015-11-13 20:43:32
【问题描述】:

我是 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;
};

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

感谢您的帮助! :)

【问题讨论】:

  • 他们在做完全不同的事情。随着您有更多的迁移,最终的User 模型的意图将不太明显。我宁愿有一个 User 类的真实来源,也不愿查看许多迁移来发现它的属性。
  • 感谢您的评论,我同意应该有一个来源或真相。然而,具有 DB 模式的模型文件和许多迁移也具有 DB 模式更改并不会使事情变得更加“一个真实的来源”,相反它会使事情变得更加混乱。因此我的问题是,有没有办法删除重复?
  • 什么重复?如果您有 10 个迁移文件都修改了 user 表,那么您在应用程序代码中使用的 Schema 是什么样的?迁移甚至不需要存在于同一个源存储库中,除非您专门执行它们,否则它们不会执行。
  • 同样的问题,我想使用 migrates 来创建表并保留更改记录。当我们定义模型发生变化时,迁移应该(更好)自动生成,例如南(django)。

标签: node.js sequelize.js


【解决方案1】:

正如@WiredPrairie 在他/她的评论中提到的那样,迁移和模型上的属性是不同的东西。通常我们会创建一个具有某些属性的模型和关联的迁移来创建相应的表。稍后将向模型中添加更多属性,我们将需要创建一个迁移,为新属性添加列。

删除重复的一种方法是使用 sequelize.sync 从模型文件创建数据库。不过,这也有缺点,不应该用于部署在不同环境中的复杂应用程序。

也许未来 sequelize-cli 将有一个create:migration --model [modelfile] 选项,它将为相应的模型创建表。这将具有相同的代码“重复”,但会使事情变得更快。

【讨论】:

    【解决方案2】:

    当你最初通过 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目录下,你会自动拾取 需要('./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});
      }
    };
    

    【讨论】:

    • 动态调整initial迁移内容到模型的current状态的目的是什么?这没有任何意义。迁移应该是静态补丁。
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2018-01-29
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多