如何迁移sequelize关联?

时间:2016-02-09 09:54:03

标签: node.js sequelize.js

我在现有数据库中添加了一个新表。我在模型中创建关联,并在迁移文件中创建createTable()。在数据库中未创建db:migratesync()关联之后。 如何在现有数据库中创建assotiation witchout sync({force: true})

模型和迁移:

//new model
module.exports = (sequelize, DataTypes) => {
  return sequelize.define('batchOfDrivers', {
    id:        {
      type:          DataTypes.INTEGER,
      primaryKey:    true,
      autoIncrement: true
    }
  }, {
    freezeTableName: true,
    tableName:       'batch_of_drivers',
    classMethods:    {
      associate: models => {
        models.batchOfDrivers.hasMany(models.drivers, {
          foreignKey: 'batchId',
          onDelete: 'cascade'
        });
      }
    }
  });
};


//migration
module.exports = {
  up: function(sequelize, DataTypes) {
    return [
      sequelize.createTable(
        'batchOfDrivers',
        {
          id: {
            type:          DataTypes.INTEGER,
            primaryKey:    true,
            autoIncrement: true
          }
        }
      )
    ];
  },

  down: function(sequelize, DataTypes) {
    return [
      sequelize.removeTable('batchOfDrivers')
    ];
  }
};

2 个答案:

答案 0 :(得分:0)

看看umzug 使用它以编程方式执行迁移非常容易

答案 1 :(得分:0)

您正在创建的新模型与'驱动程序'有hasMany()关联。表。 sequelize中的has*方法将外键放在另一个(' target')表中。

在您的情况下,目标表已经存在,因此需要使用ALTER TABLE语句添加外键。您应该将其添加到迁移脚本

    //migration
module.exports = {
up: function(sequelize, DataTypes) {
  return [
    sequelize.createTable(
      'batchOfDrivers',
      {
        id: {
          type:          DataTypes.INTEGER,
          primaryKey:    true,
          autoIncrement: true
        }
      }
    ),
    // This may require 2 ALTER statements or have another syntax, depends on your DB
    sequelize.query('ALTER TABLE drivers ADD batchId INTEGER, ADD FOREIGN KEY batchId REFERENCES batchOfDrivers(id);')
  ];
},  

down: function(sequelize, DataTypes) {
  return [
    sequelize.removeTable('batchOfDrivers'),
    // Again, this ALTER statement is going to vary by DB
    sequelize.query('ALTER TABLE drivers DROP constraint drivers_batchId_fk, DROP column batchId;')
  ];
}

这通常会要求您先放下桌子。强制执行同步方法.sync({force: true})时,这就是它的作用。取决于您正在使用的数据库。