I have an project where I want to connect an existing database with the entities, so I can use typeorm and the auto-generated migrations.
I have created the entities in a basic form, however when I generate the migrations I get too many changes, some of the changes e.g. dropping constraints for foreign keys are recreated and it’s fine as a one time thing. However, the migration is re-creating primary keys and types (by dropping them and the then immediately creating them).
enum PaymentStatus {
INITIAL = 'INITIAL',
CANCELLED = 'CANCELLED',
DENIED = 'DENIED',
PENDING = 'PENDING',
DONE = 'DONE'
}
@Entity('payments')
export class Payment {
@Index('payments_user_idx')
@PrimaryColumn({
name: 'id',
type: 'varchar',
primaryKeyConstraintName: 'payments_pkey',
nullable: false,
})
id: string;
@Column({ name: 'partner_id', nullable: true, type: 'varchar' })
partnerId: string | undefined;
@Column({
type: 'enum',
enum: PaymentStatus,
default: PaymentStatus.INITIAL,
enumName: 'payments_status_enum',
nullable: false,
})
status: PaymentStatus;
}
This is the generated migration
await queryRunner.query('DROP INDEX "public"."payments_user_idx"');
await queryRunner.query('ALTER TABLE "payments" DROP CONSTRAINT "payments_pkey"');
await queryRunner.query('ALTER TABLE "payments" DROP COLUMN "id"');
await queryRunner.query('ALTER TABLE "payments" ADD "id" character varying NOT NULL');
await queryRunner.query(
'ALTER TABLE "payments" ADD CONSTRAINT "payments_pkey" PRIMARY KEY ("id")',
);
await queryRunner.query('ALTER TABLE "payments" DROP COLUMN "partner_id"');
await queryRunner.query('ALTER TABLE "payments" ADD "partner_id" character varying');
await queryRunner.query(
'ALTER TYPE "public"."payment_status" RENAME TO "payment_status_old"',
);
await queryRunner.query(
"CREATE TYPE "public"."payments_status_enum" AS ENUM('INITIAL', 'CANCELLED', 'DENIED', 'PENDING', 'DONE')",
);
await queryRunner.query('ALTER TABLE "payments" ALTER COLUMN "status" DROP DEFAULT');
await queryRunner.query(
'ALTER TABLE "payments" ALTER COLUMN "status" TYPE "public"."payments_status_enum" USING "status"::"text"::"public"."payments_status_enum"',
);
What am I doing wrong in the definition of the entity? Can this be fixed or is it a bug?
I’m leaning on avoiding auto-generated migrations and just go with a simple entity definition.