node.js - Sequelize - 更新 FOREIGN KEY 约束赢得 ONDELETE CASCADE
问题描述
我正在使用带有 Sequelize 的 Postgres,我需要ForeignKey
使用onDelete = Cascade
.
我已经更新了我的模型,但是迁移文件以骨架的形式出现。我还没有找到更新此约束的方法。
我的模型文件:
export const Property = sequelize.define<PropertyModel, PropertyAttribute>('property', {
id: {
type: Sequelize.UUID,
primaryKey: true,
defaultValue: Sequelize.UUIDV4,
allowNull: false
},
name: Sequelize.STRING,
status: {
type: Sequelize.BOOLEAN,
defaultValue: true
},
publishedAt: Sequelize.DATE
});
Property.associate = models => {
Property.belongsTo(models.User, {
foreignKey: { allowNull: false },
allowNull: false
});
Property.hasMany(
models.PropertyService, {onDelete: "cascade"});
Property.hasMany(
models.Visitor, {onDelete: "cascade"});
};
我的迁移文件:
module.exports = {
up: (queryInterface, Sequelize) => {
// How can I update a FK constraint??
},
down: (queryInterface, Sequelize) => {
// How can I undo an FK update constraint??
}
};
关于如何进行此迁移的任何想法?
解决方案
我发现最简单的方法是首先删除现有约束,然后使用 onDelete 将其添加回来。Sequelize 有这方面queryInterface.removeConstraint
的queryInterface.addConstraint
方法。
这是一个人为的例子:
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeConstraint(
'users',
'users_address_id_fkey',
{ transaction }
);
await queryInterface.addConstraint('users', ['address_id'], {
type: 'foreign key',
name: 'users_address_id_fkey',
references: {
table: 'addresses',
field: 'id',
},
onDelete: 'CASCADE',
transaction
});
return transaction.commit();
} catch (error) {
await transaction.rollback();
throw error;
}
},
down: async (queryInterface, Sequelize) => {
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeConstraint(
'users',
'users_address_id_fkey',
{ transaction }
);
await queryInterface.addConstraint('users', ['address_id'], {
type: 'foreign key',
name: 'users_address_id_fkey',
references: {
table: 'addresses',
field: 'id',
},
transaction
});
return transaction.commit();
} catch (error) {
await transaction.rollback();
throw error;
}
},
};
推荐阅读
- visual-studio-2010 - Visual Studio 2017 Linux 控制台添加更多行并始终查看最新行
- python - Google Cloud Pub/Sub Python SDK 一次检索单个消息
- jenkins - 编辑 Jenkins sysconfig 不更改主目录 - RHEL
- ethereum - 重用已部署的库?
- windows - 如何通过命令行使用 gnupg 生成加密文档?
- c# - 在 C# 中更改字典值数组中的元素
- java - Java 中的 AES 解密耗时太长
- apache-spark - Spark 基于字母分区写入镶木地板
- python - 如何为python创建一个原子模板
- javascript - AngularJS 无法加载资源