#sql #postgresql #sequelize.js
#sql #postgresql #sequelize.js
Вопрос:
Я не могу приступить { onDelete: 'cascade' }
к работе. У меня есть таблица пользователя, которая имеет много ассоциаций (20?), И удаление одной строки пользователя не работает, потому что первичный ключ зависит от многих других таблиц. Я попробовал следующее:
- Настройка
{ onDelete: 'cascade' }
для родительской ассоциации - Также включая
{ hooks: true }
родительскую ассоциацию - Настройка
{ onDelete: 'cascade' }
для дочерней ассоциации - Пишу миграцию для добавления
{ onDelete: 'cascade' }
к типу идентификатора в таблице users, но получил следующую ошибку, потому что удаление ограничения первичного ключа невозможно для добавления измененияERROR: cannot drop constraint users_pkey on table users because other objects depend on it
- Включая
{ onDelete: 'cascade', hooks: true }
инициализацию типа идентификатора при миграции, при которой создается таблица пользователей.
Ответ №1:
я думал, что проблема в том, что { onDelete: 'cascade' }
не работает с моими ассоциациями моделей, но на самом деле проблема заключалась в том, что я сначала не добавил onDelete: 'cascade'
ограничение к внешнему ключу в соответствующих таблицах с миграциями.
я упускал из виду простой факт, что sequelize.js является ORM или подобным уровнем абстракции, который облегчает взаимодействие с базой данных. и модели sequelize действуют как отражение того, что может быть достигнуто. итак, сначала таблицы должны быть настроены правильно / по желанию (для OnDelete необходимо установить значение ‘cascade’ или ‘sell null’ и т.д.), Прежде чем sequelize сможет выполнить запрос.
пример:
//создать миграцию пользовательских таблиц
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),
});
// таблица электронной почты (случайно) создана без ограничения внешнего ключа для каскадирования при удалении
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’ для ограничения внешнего ключа в таблице электронных писем
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',
},
});
}
Комментарии:
1. Привет, я думаю, что столкнулся с этой же проблемой; я пробовал выше, но безуспешно. когда вы говорите, что добавили ограничение OnDelete к внешнему ключу: вы сделали это в определении модели?
2. итак, сначала я добавил
onDelete: 'cascade'
ограничение к внешнему ключу в соответствующих таблицах с миграциями. затем я добавилonDelete: 'cascade'
к ассоциациям в моделях. я должен отредактировать свой ответ