首页 > 解决方案 > 使用 typeorm 生成迁移时,关系“表”的约束“PK”不存在

问题描述

我有一个这样的 ormconfig.ts:

const config: ConnectionOptions = {
  type: "postgres",
  host: "localhost",
  username: "postgres",
  password: "postgres",
  database: "dbname",
  entities: ["dist/database/entities/**/*.js"],
  migrations: ["dist/migration/**/*.js"],
  cli: {
    entitiesDir: "src/database/entities",
    migrationsDir: "src/migration",
  },
  synchronize: true,
  name: "app",
};

和这样的实体:

@Entity("follows")
export class Follow extends BaseEntity {
  @PrimaryColumn()
  followerAddress: string;

  @PrimaryColumn()
  followeeAddress: string;

  @OneToOne(() => User, (user) => user.address)
  @JoinColumn({ name: "followerAddress" })
  followerUser: User;

  @OneToOne(() => User, (user) => user.address)
  @JoinColumn({ name: "followeeAddress" })
  followeeUser: User;
}

如果我重命名 PrimaryColumns 并使其像:

@Entity("follows")
export class Follow extends BaseEntity {
  @PrimaryColumn()
  followerAddressNew: string;

  @PrimaryColumn()
  followeeAddressNew: string;

  @OneToOne(() => User, (user) => user)
  @JoinColumn({ name: "followerAddress" })
  followerUser: User;

  @OneToOne(() => User, (user) => user)
  @JoinColumn({ name: "followeeAddress" })
  followeeUser: User;
}

然后我收到以下错误:

QueryFailedError: constraint "PK_0d65998d7ca318692c5021c8121" of relation "follows" does not exist

Synchronize 设置为 true,所以我不确定是否需要生成并运行迁移,但我尝试过并得到:

QueryFailedError: constraint "PK_439cf7d31c1f020884802168a8c" of relation "follows" does not exist

似乎生成的迁移文件添加了一次约束然后将其删除了两次?

public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD "followerAddressfdsa" character varying NOT NULL`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "PK_3f7767cc6077ad78f956bffc8a7"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "PK_59ecb7646bafb5e2ae63d6f8deb" PRIMARY KEY ("followerAddress", "followeeAddress", "followerAddressfdsa")`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD "followeeAddressfdsa" character varying NOT NULL`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "PK_59ecb7646bafb5e2ae63d6f8deb"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "PK_439cf7d31c1f020884802168a8c" PRIMARY KEY ("followerAddress", "followeeAddress", "followerAddressfdsa", "followeeAddressfdsa")`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "PK_439cf7d31c1f020884802168a8c"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "PK_073836419485cc2ca626f9ce5a8" PRIMARY KEY ("followerAddressfdsa", "followeeAddressfdsa")`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "FK_e37f798c5697e8b84094d64a68f"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "FK_70456987d622cd40a732aec83bd"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ALTER COLUMN "followerAddress" DROP NOT NULL`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "PK_439cf7d31c1f020884802168a8c"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "PK_b9a8a76998607a9752a4d756814" PRIMARY KEY ("followeeAddress", "followerAddressfdsa", "followeeAddressfdsa")`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ALTER COLUMN "followeeAddress" DROP NOT NULL`);
        await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "PK_b9a8a76998607a9752a4d756814"`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "PK_073836419485cc2ca626f9ce5a8" PRIMARY KEY ("followerAddressfdsa", "followeeAddressfdsa")`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "FK_e37f798c5697e8b84094d64a68f" FOREIGN KEY ("followerAddress") REFERENCES "users"("address") ON DELETE NO ACTION ON UPDATE NO ACTION`);
        await queryRunner.query(`ALTER TABLE "public"."follows" ADD CONSTRAINT "FK_70456987d622cd40a732aec83bd" FOREIGN KEY ("followeeAddress") REFERENCES "users"("address") ON DELETE NO ACTION ON UPDATE NO ACTION`);
    }

这条线似乎被调用了两次:

    await queryRunner.query(`ALTER TABLE "public"."follows" DROP CONSTRAINT "PK_439cf7d31c1f020884802168a8c"`);

标签: sqlpostgresqlprimary-keytypeormcomposite-primary-key

解决方案


我不知道 typeorm 到底发生了什么。可能是使用实体更新或创建架构的错误。

但是我遇到了同样的问题,我发现表已经在数据库中创建了。我删除了所有已创建的表并运行应用程序,以便 typeorm(重新)创建表。这为我解决了问题。

我希望这也适用于你。


推荐阅读