продолжение для psql OnDelete: каскад не работает

#sql #postgresql #sequelize.js

#sql #postgresql #sequelize.js

Вопрос:

Я не могу приступить { onDelete: 'cascade' } к работе. У меня есть таблица пользователя, которая имеет много ассоциаций (20?), И удаление одной строки пользователя не работает, потому что первичный ключ зависит от многих других таблиц. Я попробовал следующее:

  1. Настройка { onDelete: 'cascade' } для родительской ассоциации
  2. Также включая { hooks: true } родительскую ассоциацию
  3. Настройка { onDelete: 'cascade' } для дочерней ассоциации
  4. Пишу миграцию для добавления { onDelete: 'cascade' } к типу идентификатора в таблице users, но получил следующую ошибку, потому что удаление ограничения первичного ключа невозможно для добавления изменения ERROR: cannot drop constraint users_pkey on table users because other objects depend on it
  5. Включая { 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' к ассоциациям в моделях. я должен отредактировать свой ответ