【问题标题】:Node Sequelize migrations/models is it possible to share the same code?节点续集迁移/模型是否可以共享相同的代码?
【发布时间】:2015-10-09 07:30:07
【问题描述】:

我是 Sequelize 的新手,所以请耐心等待。

我使用 Sequelize 启动了一个新项目 和迁移,所以我有这样的:

迁移/20150210104840-create-my-user.js:

"use strict";
module.exports = {
  up: function(migration, DataTypes, done) {
    migration.createTable("MyUsers", {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: DataTypes.INTEGER
      },
      first_name: {
        type: DataTypes.STRING
      },
      last_name: {
        type: DataTypes.STRING
      },
      bio: {
        type: DataTypes.TEXT
      },
      createdAt: {
        allowNull: false,
        type: DataTypes.DATE
      },
      updatedAt: {
        allowNull: false,
        type: DataTypes.DATE
      }
    }).done(done);
  },
  down: function(migration, DataTypes, done) {
    migration.dropTable("MyUsers").done(done);
  }
};

models/myuser.js:

"use strict";
module.exports = function(sequelize, DataTypes) {
  var MyUser = sequelize.define("MyUser", {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    bio: DataTypes.TEXT
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return MyUser;
};

如您所见,表格定义 在迁移和模型文件上都有。

我想知道是否有办法分享 代码?

我的意思是我不喜欢在两个文件中包含逻辑 如果一个字段发生变化,我必须更新两次。

更新

按照下面的 Yan Foto 示例 其他方式可能更清洁。

架构/用户

'use strict';

module.exports = {
    name: 'users',
    definition : function(DataTypes)  {
        return {
            id: {
                type: DataTypes.INTEGER,
                autoIncrement: true,
                primaryKey: true
            },
            firstname: {
                type:DataTypes.STRING
            },
            lastname: {
                type:DataTypes.STRING
            },
            email: {
                type: DataTypes.STRING,
                unique: true
            },
            username: {
                type:DataTypes.STRING,
                unique: true
            }
        };
    }
};

模型/用户

'use strict';

var Schema = require('../schemas/users');

module.exports = function(sequelize, DataTypes) {
    return sequelize.define(
        Schema.name,
        Schema.definition(DataTypes),
        {
            freezeTableName: true ,
                instanceMethods: {
                countTasks: function() {
                        // how to implement this method ?
                }
                }
        }
    );
};

迁移/20150720184716-users.js

'use strict';

    var Schema = require('../schemas/users');

    module.exports = {

        up: function (queryInterface, Sequelize) {
                return queryInterface.createTable(
                Schema.name,
                Schema.definition(Sequelize)
                );
        },

        down: function (queryInterface, Sequelize) {
            return queryInterface.dropTable(Schema.name);
        }

    };

【问题讨论】:

  • 我知道这已经很老了,但通常迁移的重点是在它们运行后您不会更改它们,因此如果您需要向模型添加字段,请创建一个新的迁移文件对您的数据库进行更改,因此您不会总是对 1 个模型进行 1 次迁移。您可以进行许多调整表的迁移,并且模型定义应该是更改的组合。如果您不需要此功能,您可以使用 sequelize.sync() 并且您的模型将在数据库中指示您的表而无需迁移。

标签: node.js sequelize.js


【解决方案1】:

我在开始使用 sequelize 时也想知道同样的事情,这是我的解决方案。我将我的模型定义如下:

module.exports = {
  def: function(DataTypes) {
    return {
      id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
      },
      username: DataTypes.STRING,
      password: DataTypes.STRING,
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    }
  },
  config: {}
};

其中def 定义属性,configdefinemigration methods 接受的可选options 对象。我使用以下代码导入它们:

fs.readdirSync(__dirname + '/PATH/TO/models')
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename);
  })
  .forEach(function(file) {
    var name = file.substring(0, file.lastIndexOf(".")),
        definition = require(path.join(__dirname + '/models', file));

    sequelize['import'](name, function(sequelize, DataTypes) {
      return sequelize.define(
        name,
        definition.def(DataTypes),
        definition.config
      );
    });
  });

对于迁移,我有类似的方法:

const path = require('path');

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.createTable(
      'users',
      require(path.join(__dirname + '/PATH/TO/models', 'user.js')).def(Sequelize)
    );
  },

  down: function (queryInterface, Sequelize) {
    return queryInterface.dropTable('users');
  }
};

【讨论】:

  • 我以完全相同的方式结束。我更新了线程。感谢您的线索和反馈
  • @Whisher 如果我应该添加任何内容以使其符合正确答案的条件,请告诉我。
  • 有趣的方法。如何处理添加列等突变?
猜你喜欢
  • 2019-05-18
  • 2012-08-17
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2014-07-23
  • 1970-01-01
  • 2016-12-24
相关资源
最近更新 更多