psql onDelete 的续集:级联不起作用

sequelize for psql onDelete: cascade not working

我无法让 { onDelete: 'cascade' } 工作。我有一个用户 table,它有很多关联(20 个?)并且删除一个用户行失败,因为主键依赖于许多其他 table。我尝试了以下方法:

  1. 在家长协会上设置{ onDelete: 'cascade' }
  2. 还包括 { hooks: true } 上级协会
  3. 在子关联上设置{ onDelete: 'cascade' }
  4. 正在编写迁移以将 { onDelete: 'cascade' } 添加到用户 table 的 id 类型,但收到以下错误,因为无法删除主键约束以添加更改 ERROR: cannot drop constraint users_pkey on table users because other objects depend on it
  5. 在创建用户 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',
        },
      });
  }