Skip to content

Commit 416e419

Browse files
zaroSvetlozar Argirov
andauthored
fix: migrations being generated for FK even if there are no changes (#5869)
* Fix migrations being generated for FK even if there are no changes * Fix tslint errors Co-authored-by: Svetlozar Argirov <ext-svetlozar@getitdone.co>
1 parent a0feabc commit 416e419

File tree

6 files changed

+104
-3
lines changed

6 files changed

+104
-3
lines changed

src/driver/postgres/PostgresQueryRunner.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,6 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner
14241424
this.query(indicesSql),
14251425
this.query(foreignKeysSql),
14261426
]);
1427-
14281427
// if tables were not found in the db, no need to proceed
14291428
if (!dbTables.length)
14301429
return [];
@@ -1433,9 +1432,10 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner
14331432
return Promise.all(dbTables.map(async dbTable => {
14341433
const table = new Table();
14351434

1435+
const getSchemaFromKey = (dbObject: any, key: string) => dbObject[key] === currentSchema && !this.driver.options.schema ? undefined : dbObject[key];
14361436
// We do not need to join schema name, when database is by default.
14371437
// In this case we need local variable `tableFullName` for below comparision.
1438-
const schema = dbTable["table_schema"] === currentSchema && !this.driver.options.schema ? undefined : dbTable["table_schema"];
1438+
const schema = getSchemaFromKey(dbTable, "table_schema");
14391439
table.name = this.driver.buildTableName(dbTable["table_name"], schema);
14401440
const tableFullName = this.driver.buildTableName(dbTable["table_name"], dbTable["table_schema"]);
14411441

@@ -1612,7 +1612,7 @@ export class PostgresQueryRunner extends BaseQueryRunner implements QueryRunner
16121612
const foreignKeys = dbForeignKeys.filter(dbFk => dbFk["constraint_name"] === dbForeignKey["constraint_name"]);
16131613

16141614
// if referenced table located in currently used schema, we don't need to concat schema name to table name.
1615-
const schema = dbForeignKey["referenced_table_schema"] === currentSchema ? undefined : dbForeignKey["referenced_table_schema"];
1615+
const schema = getSchemaFromKey(dbForeignKey, "referenced_table_schema");
16161616
const referencedTableName = this.driver.buildTableName(dbForeignKey["referenced_table_name"], schema);
16171617

16181618
return new TableForeignKey({
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import "reflect-metadata";
2+
import {createTestingConnections, closeTestingConnections, /*reloadTestingDatabases*/} from "../../../utils/test-utils";
3+
import {Connection} from "../../../../src/connection/Connection";
4+
import { Category, Post } from "./entity";
5+
6+
describe("migrations > generate command", () => {
7+
let connections: Connection[];
8+
before(async () => connections = await createTestingConnections({
9+
migrations: [],
10+
enabledDrivers: ["postgres"],
11+
schemaCreate: false,
12+
dropSchema: true,
13+
entities: [Post, Category],
14+
logging: true,
15+
schema: "public",
16+
}));
17+
// beforeEach(() => reloadTestingDatabases(connections));
18+
after(() => closeTestingConnections(connections));
19+
20+
it("can recognize model changes", () => Promise.all(connections.map(async connection => {
21+
const sqlInMemory = await connection.driver.createSchemaBuilder().log();
22+
sqlInMemory.upQueries.length.should.be.greaterThan(0);
23+
sqlInMemory.downQueries.length.should.be.greaterThan(0);
24+
})));
25+
26+
it("does not generate when no model changes", () => Promise.all(connections.map(async connection => {
27+
await connection.driver.createSchemaBuilder().build();
28+
29+
const sqlInMemory = await connection.driver.createSchemaBuilder().log();
30+
31+
console.log(sqlInMemory.upQueries);
32+
sqlInMemory.upQueries.length.should.be.equal(0);
33+
sqlInMemory.downQueries.length.should.be.equal(0);
34+
35+
})));
36+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import {PrimaryColumn} from "../../../../../src/decorator/columns/PrimaryColumn";
2+
import {Entity} from "../../../../../src/decorator/entity/Entity";
3+
import {BaseEntity} from "../../../../../src/repository/BaseEntity";
4+
import {Column} from "../../../../../src/decorator/columns/Column";
5+
6+
@Entity("category_test", { schema: "public" })
7+
export class Category extends BaseEntity {
8+
9+
@PrimaryColumn()
10+
id: number;
11+
12+
@Column()
13+
name: string;
14+
15+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export {Post} from "./post.entity";
2+
export {Category} from "./category.entity";
3+
export {Tag} from "./tag.entity";
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {Entity} from "../../../../../src/decorator/entity/Entity";
2+
import {BaseEntity} from "../../../../../src/repository/BaseEntity";
3+
import {PrimaryGeneratedColumn} from "../../../../../src/decorator/columns/PrimaryGeneratedColumn";
4+
import {Column} from "../../../../../src/decorator/columns/Column";
5+
import {ManyToMany, JoinTable} from "../../../../../src";
6+
import {Category} from "./category.entity";
7+
8+
@Entity("post_test", { schema: "public" })
9+
export class Post extends BaseEntity {
10+
11+
@PrimaryGeneratedColumn()
12+
id: number;
13+
14+
@Column()
15+
title: string;
16+
17+
@Column({
18+
default: "This is default text."
19+
})
20+
text: string;
21+
22+
@ManyToMany(type => Category)
23+
@JoinTable()
24+
categories: Category[];
25+
26+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {PrimaryColumn} from "../../../../../src/decorator/columns/PrimaryColumn";
2+
import {ManyToOne} from "../../../../../src/decorator/relations/ManyToOne";
3+
import {JoinColumn} from "../../../../../src/decorator/relations/JoinColumn";
4+
import {Entity} from "../../../../../src/decorator/entity/Entity";
5+
import {BaseEntity} from "../../../../../src/repository/BaseEntity";
6+
import {Column} from "../../../../../src/decorator/columns/Column";
7+
import {Post} from "./post.entity";
8+
9+
@Entity("tag_test", { schema: "public" })
10+
export class Tag extends BaseEntity {
11+
12+
@PrimaryColumn()
13+
id: number;
14+
15+
@Column()
16+
name: string;
17+
18+
@ManyToOne(() => Post)
19+
@JoinColumn({ name: "tag_to_post" })
20+
posts: Post | null;
21+
}

0 commit comments

Comments
 (0)