Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 继续迁移_Node.js_Sequelize.js - Fatal编程技术网

Node.js 继续迁移

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

我是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;
};
但是这个模型看起来是这样的:

//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)。动态地将初始迁移内容调整到模型的当前状态的目的是什么?这没有任何意义。迁移应该是一个静态补丁。