【问题标题】:Constraint "PK" of relation "table" does not exist when generating migration with typeorm使用 typeorm 生成迁移时,关系“表”的约束“PK”不存在
【发布时间】:2021-08-27 17:37:39
【问题描述】:

我有一个这样的 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

好像生成的migration文件加了一次约束,然后又丢了两次?

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"`);

【问题讨论】:

    标签: sql postgresql primary-key typeorm composite-primary-key


    【解决方案1】:

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

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

    我希望这也适用于你。

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 2021-07-07
      • 2019-11-17
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多