gpt4 book ai didi

node.js - 如何迁移 Sequelize 关联?

转载 作者:行者123 更新时间:2023-12-03 22:20:28 26 4
gpt4 key购买 nike

我向现有数据库添加了一个新表。我在模型中创建关联,并在迁移文件中创建 createTable()。在数据库中未创建 db:migratesync() 关联之后。
如何在现有数据库中创建关联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')
];
}
};

最佳答案

您正在创建的新模型与 'drivers' 表具有 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}) 时,它​​就是这样做的。取决于您使用的数据库。

关于node.js - 如何迁移 Sequelize 关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35288822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com