代码之家  ›  专栏  ›  技术社区  ›  Gary

在TypeORM中,向实体添加列时,`SQLITE\u CONSTRAINT:FOREIGN KEY CONSTRAINT failed`

  •  0
  • Gary  · 技术社区  · 6 年前

    我有一个类型实体,叫做 Photo @OneToOne 与另一个实体的关系,称为 PhotoMetadata .

    Photo.ts

    import {
      Entity,
      Column,
      PrimaryGeneratedColumn,
      OneToOne,
      BaseEntity,
    } from 'typeorm';
    
    import PhotoMetadata from './PhotoMetadata';
    
    @Entity()
    export default class Photo extends BaseEntity {
      @PrimaryGeneratedColumn()
      public id: number;
    
      @Column({ length: 100 })
      public name: string;
    
      @OneToOne(
        () => PhotoMetadata,
        (photoMetadata) => photoMetadata.photo,
        { cascade: true },
      )
      metadata: PhotoMetadata;
    }
    

    这里是 PhotoMetadata.ts :

    import {
      Entity,
      Column,
      PrimaryGeneratedColumn,
      OneToOne,
      JoinColumn,
    } from 'typeorm';
    
    import Photo from './Photo';
    
    @Entity()
    export default class PhotoMetadata {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      comment: string;
    
      @OneToOne(
        () => Photo,
        (photo) => photo.metadata,
      )
      @JoinColumn()
      photo: Photo;
    }
    

    当我将列添加到 ,例如:

      @Column({ nullable: true })
      test: string;
    

    query: BEGIN TRANSACTION
    query: SELECT * FROM "sqlite_master" WHERE "type" = 'table' AND "name" IN ('photo_metadata', 'photo', 'user')
    query: SELECT * FROM "sqlite_master" WHERE "type" = 'index' AND "tbl_name" IN ('photo_metadata', 'photo', 'user')
    query: PRAGMA table_info("user")
    query: PRAGMA index_list("user")
    query: PRAGMA foreign_key_list("user")
    query: PRAGMA table_info("photo")
    query: PRAGMA index_list("photo")
    query: PRAGMA foreign_key_list("photo")
    query: PRAGMA table_info("photo_metadata")
    query: PRAGMA index_list("photo_metadata")
    query: PRAGMA foreign_key_list("photo_metadata")
    query: PRAGMA index_info("sqlite_autoindex_photo_metadata_1")
    query: SELECT * FROM "sqlite_master" WHERE "type" = 'table' AND "name" = 'typeorm_metadata'
    query: CREATE TABLE "temporary_photo_metadata" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "comment" varchar NOT NULL, "photoId" integer, CONSTRAINT "UQ_99f01ed52303cc16139d69f7464" UNIQUE ("photoId"), CONSTRAINT "FK_99f01ed52303cc16139d69f7464" FOREIGN KEY ("photoId") REFERENCES "photo" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)
    query: INSERT INTO "temporary_photo_metadata"("id", "comment", "photoId") SELECT "id", "comment", "photoId" FROM "photo_metadata"
    query: DROP TABLE "photo_metadata"
    query: ALTER TABLE "temporary_photo_metadata" RENAME TO "photo_metadata"
    query: CREATE TABLE "temporary_photo" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(100) NOT NULL)
    query: INSERT INTO "temporary_photo"("id", "name") SELECT "id", "name" FROM "photo"
    query: DROP TABLE "photo"
    query failed: DROP TABLE "photo"
    error: [Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed] {
      errno: 19,
      code: 'SQLITE_CONSTRAINT'
    }
    query: ROLLBACK
    

    如何解决此问题?由于外键的原因,删除我修改的照片表似乎失败了。

    0 回复  |  直到 6 年前
        1
  •  5
  •   Gary    6 年前

    我尝试使用TypeORM迁移来实现这一点,但遇到了相同的问题。

    this comment

    const connection = await createConnection();
    
    await connection.query('PRAGMA foreign_keys=OFF');
    await connection.synchronize();
    await connection.query('PRAGMA foreign_keys=ON');
    

    或者如果您想使用迁移,那么从 this comment

    await connection.query("PRAGMA foreign_keys=OFF;");
    await connection.runMigrations();
    await connection.query("PRAGMA foreign_keys=ON;");
    

    无论哪种情况,你都需要 synchronize: false 在你的 ormconfig.json .

    推荐文章