как использовать onDelete: 'CASCADE' на TypeORM - PullRequest
0 голосов
/ 11 марта 2020

У меня 2 миграции. Пользователи и сообщения и сообщения имеют onDelete: 'CASCADE'. По какой-то причине, когда я удаляю пользователя с сообщениями, он выдает ошибку:

"Cannot delete or update a parent row: a foreign key constraint fails ( development_db . posts , CONSTRAINT posts_ibfk_1 FOREIGN KEY ( userId ) REFERENCES users ( id ))",

но я уже установил для своей сущности сообщения значение onDelete: 'CASCADE'. Меня сбивает с толку то, что когда я добавляю ON DELETE CASCADE в миграцию своих сообщений, каскадное удаление работает, даже если я удалил onDelete: 'CASCADE' в моей модели сообщений. Есть идеи? Так что же использовать onDelete в typeorm, когда вы можете установить его для миграции, а не для сущности, но все еще работает.

Миграция пользователя:

/* eslint-disable class-methods-use-this */
import { MigrationInterface, QueryRunner } from 'typeorm';

export class UsersTable1575433829516 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(`
            CREATE TABLE users (
              id INT AUTO_INCREMENT,
              username VARCHAR(50) NOT NULL,
              email VARCHAR(50) NOT NULL UNIQUE,
              password VARCHAR(255) NOT NULL,
              createdAt DATETIME NOT NULL,
              PRIMARY KEY(id)
            );
        `);
  }

  public async down(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.dropTable('users', true);
  }
}

Миграция POST:

/* eslint-disable class-methods-use-this */
import { MigrationInterface, QueryRunner } from 'typeorm';

export class PostsTable1581617587575 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(`
        CREATE TABLE posts (
          id INT AUTO_INCREMENT,
          title VARCHAR(255) NOT NULL,
          body TEXT(65000) NOT NULL,
          createdAt DATETIME NOT NULL,
          updatedAt DATETIME,
          PRIMARY KEY(id),
          userId INT NOT NULL,
          FOREIGN KEY (userId) 
                  REFERENCES users (id)
        );
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.dropTable('posts', true);
  }
}
...