psql onDelete 的续集:级联不起作用
sequelize for psql onDelete: cascade not working
我无法让 { onDelete: 'cascade' }
工作。我有一个用户 table,它有很多关联(20 个?)并且删除一个用户行失败,因为主键依赖于许多其他 table。我尝试了以下方法:
- 在家长协会上设置
{ onDelete: 'cascade' }
- 还包括
{ hooks: true }
上级协会
- 在子关联上设置
{ onDelete: 'cascade' }
- 正在编写迁移以将
{ onDelete: 'cascade' }
添加到用户 table 的 id 类型,但收到以下错误,因为无法删除主键约束以添加更改 ERROR: cannot drop constraint users_pkey on table users because other objects depend on it
- 在创建用户 table 的迁移的 id 类型初始化中包含
{ onDelete: 'cascade', hooks: true }
。
我认为问题是 { onDelete: 'cascade' }
没有在我的模型关联上工作,但实际上问题是我没有首先将 onDelete: 'cascade'
约束添加到相关的外键table 迁移。
我忽略了一个简单的事实,即 sequelize.js 是一个 ORM 或类似于促进与数据库交互的抽象层。 sequelize 模型反映了可以实现的目标。所以首先需要设置 tables correctly/as 所需(onDelete 需要设置为 'cascade' 或 'sell null' 等),然后 sequelize 才能促进请求。
示例:
//创建用户table迁移
await queryInterface.createTable('users', {
id: {
type: Sequelize.UUID,
defaultValue: Sequelize.literal('uuid_generate_v4()'),
primaryKey: true,
},
first_name: Sequelize.STRING(100),
last_name: Sequelize.STRING(100),
profile_photo: Sequelize.STRING(200),
});
//电子邮件table(意外)创建时没有外键约束以在删除时级联
await queryInterface.createTable('emails', {
id: {
type: Sequelize.UUID,
primaryKey: true,
},
user_id: {
type: Sequelize.UUID,
references: {
model: 'users',
key: 'id',
},
allowNull: false,
unique: true,
// onDelete would/could/should be set to cascade here
},
email: {
type: Sequelize.STRING(100),
allowNull: false,
unique: true,
},
});
//创建迁移以将 onDelete 设置为 'cascade' 用于电子邮件的外键约束 table
await queryInterface.removeConstraint('emails', 'emails_user_id_fkey');
await queryInterface.addConstraint('emails', {
fields: ['user_id'],
type: 'foreign key',
name: 'emails_user_id_fkey',
onDelete: 'cascade', // setting onDelete to cascade
references: {
table: 'users',
field: 'id',
},
});
}
我无法让 { onDelete: 'cascade' }
工作。我有一个用户 table,它有很多关联(20 个?)并且删除一个用户行失败,因为主键依赖于许多其他 table。我尝试了以下方法:
- 在家长协会上设置
{ onDelete: 'cascade' }
- 还包括
{ hooks: true }
上级协会 - 在子关联上设置
{ onDelete: 'cascade' }
- 正在编写迁移以将
{ onDelete: 'cascade' }
添加到用户 table 的 id 类型,但收到以下错误,因为无法删除主键约束以添加更改ERROR: cannot drop constraint users_pkey on table users because other objects depend on it
- 在创建用户 table 的迁移的 id 类型初始化中包含
{ onDelete: 'cascade', hooks: true }
。
我认为问题是 { onDelete: 'cascade' }
没有在我的模型关联上工作,但实际上问题是我没有首先将 onDelete: 'cascade'
约束添加到相关的外键table 迁移。
我忽略了一个简单的事实,即 sequelize.js 是一个 ORM 或类似于促进与数据库交互的抽象层。 sequelize 模型反映了可以实现的目标。所以首先需要设置 tables correctly/as 所需(onDelete 需要设置为 'cascade' 或 'sell null' 等),然后 sequelize 才能促进请求。
示例:
//创建用户table迁移
await queryInterface.createTable('users', {
id: {
type: Sequelize.UUID,
defaultValue: Sequelize.literal('uuid_generate_v4()'),
primaryKey: true,
},
first_name: Sequelize.STRING(100),
last_name: Sequelize.STRING(100),
profile_photo: Sequelize.STRING(200),
});
//电子邮件table(意外)创建时没有外键约束以在删除时级联
await queryInterface.createTable('emails', {
id: {
type: Sequelize.UUID,
primaryKey: true,
},
user_id: {
type: Sequelize.UUID,
references: {
model: 'users',
key: 'id',
},
allowNull: false,
unique: true,
// onDelete would/could/should be set to cascade here
},
email: {
type: Sequelize.STRING(100),
allowNull: false,
unique: true,
},
});
//创建迁移以将 onDelete 设置为 'cascade' 用于电子邮件的外键约束 table
await queryInterface.removeConstraint('emails', 'emails_user_id_fkey');
await queryInterface.addConstraint('emails', {
fields: ['user_id'],
type: 'foreign key',
name: 'emails_user_id_fkey',
onDelete: 'cascade', // setting onDelete to cascade
references: {
table: 'users',
field: 'id',
},
});
}