Skip to content

Commit

Permalink
fix: Postgres enum generates unnecessary queries on schema sync (#8268)
Browse files Browse the repository at this point in the history
Co-authored-by: Matthias Helmrich <helmsonsen@gmai.com>
  • Loading branch information
helmsonsen and Matthias Helmrich committed Nov 13, 2021
1 parent 1f558b1 commit 98d5f39
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/driver/postgres/PostgresQueryRunner.ts
Expand Up @@ -1800,7 +1800,7 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner
} else if (dbColumn["column_default"] === "now()" || dbColumn["column_default"].indexOf("'now'::text") !== -1) {
tableColumn.default = dbColumn["column_default"];
} else {
tableColumn.default = dbColumn["column_default"].replace(/::[\w\s\[\]\"]+/g, "");
tableColumn.default = dbColumn["column_default"].replace(/::[\w\s\.\[\]\"]+/g, "");
tableColumn.default = tableColumn.default.replace(/^(-?\d+)$/, "'$1'");
}
}
Expand Down
26 changes: 26 additions & 0 deletions test/github-issues/3076/entity/SomeEntity.ts
@@ -0,0 +1,26 @@
import {Column, PrimaryGeneratedColumn} from "../../../../src";
import {Entity} from "../../../../src";

export enum CreationMechanism {
SOURCE_A = 'SOURCE_A',
SOURCE_B = 'SOURCE_B',
SOURCE_C = 'SOURCE_C',
SOURCE_D = 'SOURCE_D'
}

@Entity({ name: 'some_entity', schema: 'some_schema', })
export class SomeEntity {
@PrimaryGeneratedColumn()
id: number;

@Column({
type : 'enum',
enumName : 'creation_mechanism_enum',
enum : CreationMechanism,
default : CreationMechanism.SOURCE_A,
})
creationMechanism: CreationMechanism;

@Column({ nullable: false, default: () => 'now()' })
createdAt: Date;
}
40 changes: 40 additions & 0 deletions test/github-issues/3076/issue-3076.ts
@@ -0,0 +1,40 @@
import "reflect-metadata";
import {Connection} from "../../../src";
import {createTestingConnections, closeTestingConnections} from "../../utils/test-utils";
import {SomeEntity, CreationMechanism} from "./entity/SomeEntity";

describe("github issues > #3076 Postgres enum in schema with default is recreated in every new generated migration", () => {
let connections: Connection[];
before(async () => connections = await createTestingConnections({
migrations: [],
enabledDrivers: ["postgres"],
schemaCreate: false,
dropSchema: true,
entities: [SomeEntity],
}));
after(() => closeTestingConnections(connections));

it("should recognize model changes", () => Promise.all(connections.map(async connection => {
const sqlInMemory = await connection.driver.createSchemaBuilder().log();
sqlInMemory.upQueries.length.should.be.greaterThan(0);
sqlInMemory.downQueries.length.should.be.greaterThan(0);
})));

it("should not generate queries when no model changes", () => Promise.all(connections.map(async connection => {
await connection.driver.createSchemaBuilder().build();

const sqlInMemory = await connection.driver.createSchemaBuilder().log();
sqlInMemory.upQueries.length.should.be.equal(0);
sqlInMemory.downQueries.length.should.be.equal(0);
})));

it("should handle `enumName` default change", () => Promise.all(connections.map(async connection => {
const entityMetadata = connection.getMetadata(SomeEntity);
const columnMetadata = entityMetadata.columns.find(column => column.databaseName === "creationMechanism")
columnMetadata!.default = CreationMechanism.SOURCE_B;

const sqlInMemory = await connection.driver.createSchemaBuilder().log();
sqlInMemory.upQueries.length.should.be.greaterThan(0);
sqlInMemory.downQueries.length.should.be.greaterThan(0);
})));
});

0 comments on commit 98d5f39

Please sign in to comment.