我在现有数据库中添加了一个新表。我在模型中创建关联,并在迁移文件中创建createTable()
。在数据库中未创建db:migrate
和sync()
关联之后。
如何在现有数据库中创建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')
];
}
};
答案 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})
时,这就是它的作用。取决于您正在使用的数据库。