Skip to content

Commit

Permalink
fix(schema): respect schema when renaming columns in postgres (#3344)
Browse files Browse the repository at this point in the history
  • Loading branch information
ProjectBay committed Jul 28, 2022
1 parent e611fa0 commit f905336
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 3 deletions.
2 changes: 1 addition & 1 deletion packages/knex/src/schema/SchemaGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ export class SchemaGenerator extends AbstractSchemaGenerator<AbstractSqlDriver>
}

for (const [oldColumnName, column] of Object.entries(diff.renamedColumns)) {
this.helper.pushTableQuery(table, this.helper.getRenameColumnSQL(tableName, oldColumnName, column));
this.helper.pushTableQuery(table, this.helper.getRenameColumnSQL(tableName, oldColumnName, column, schemaName));
}

for (const foreignKey of Object.values(diff.addedForeignKeys)) {
Expand Down
7 changes: 5 additions & 2 deletions packages/knex/src/schema/SchemaHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,15 @@ export abstract class SchemaHelper {
throw new Error('Not supported by given driver');
}

getRenameColumnSQL(tableName: string, oldColumnName: string, to: Column): string {
getRenameColumnSQL(tableName: string, oldColumnName: string, to: Column, schemaName?: string): string {
tableName = this.platform.quoteIdentifier(tableName);
oldColumnName = this.platform.quoteIdentifier(oldColumnName);
const columnName = this.platform.quoteIdentifier(to.name);

return `alter table ${tableName} rename column ${oldColumnName} to ${columnName}`;
const schemaReference = (schemaName !== undefined && schemaName !== 'public') ? ('"' + schemaName + '".') : '';
const tableReference = schemaReference + tableName;

return `alter table ${tableReference} rename column ${oldColumnName} to ${columnName}`;
}

getCreateIndexSQL(tableName: string, index: Index): string {
Expand Down
77 changes: 77 additions & 0 deletions tests/issues/GH3339.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { Entity, MikroORM, PrimaryKey, Property } from '@mikro-orm/core';
import type { SqliteDriver } from '@mikro-orm/sqlite';


@Entity({
tableName: 'gh3339.Customer',
})
export class Customer1 {

@PrimaryKey({ fieldName: 'ID', type: 'number' })
id!: number;

@Property()
customerName?: string;

}

@Entity({
tableName: 'gh3339.Customer',
})
export class Customer2 {

@PrimaryKey({ fieldName: 'ID', type: 'number' })
id!: number;

@Property()
name?: string;

}

@Entity({
tableName: 'gh3339.Customer',
})
export class Customer3 {

@PrimaryKey({ fieldName: 'ID', type: 'number' })
id!: number;

@Property()
c_name?: string;

}

describe('GH issue 3339', () => {

let orm: MikroORM;

beforeAll(async () => {
orm = await MikroORM.init({
dbName: `mikro_orm_test_gh_3339`,
type: 'postgresql',
schema: 'gh3339',
entities: [ Customer1 ],
});
const generator = orm.getSchemaGenerator();
await generator.ensureDatabase();
await generator.dropSchema();
await generator.createSchema();
await generator.refreshDatabase();
});

afterAll(() => orm.close(true));

test('reference schema name when updating column names inside sql', async () => {
await orm.discoverEntity(Customer2);
orm.getMetadata().reset('Customer1');
const diff1 = await orm.getSchemaGenerator().getUpdateSchemaSQL({ wrap: false });
expect(diff1).toContain('"gh3339"."Customer"');
await orm.getSchemaGenerator().execute(diff1);

await orm.discoverEntity(Customer3);
orm.getMetadata().reset('Customer2');
const diff2 = await orm.getSchemaGenerator().getUpdateSchemaSQL({ wrap: false });
expect(diff2).toContain('"gh3339"."Customer"');
await orm.getSchemaGenerator().execute(diff2);
});
});

0 comments on commit f905336

Please sign in to comment.