Sequelize迁移

时间:2014-01-02 10:55:17

标签: node.js sequelize.js

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

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

感谢您的帮助! :)

2 个答案:

答案 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});
  }
};