Skip to content

Commit cdabaa3

Browse files
fix: synchronize with typeorm_metadata table only if needed (typeorm#9175)
* fix: create typeorm metadata table before migration, if not exists Creating a view in a migration results in an error: `QueryFailedError: relation "typeorm_metadata" does not exist` (see typeorm#9173). This fix creates the table before a migration runs. Closes: typeorm#9173 * refactor: use function from RdbmsSchemaBuilder to create typeorm_metadata table * test: add test for fix issue typeorm#9173 * test: replace describe.only() with describe() * refactor: apply suggestions from review * refactor: add syncWithMetadata param to createView function * style: run npm format * removed only test * test: add missing syncWithMetaData parameter in create-view.ts Co-authored-by: Umed Khudoiberdiev <[email protected]>
1 parent d305e5f commit cdabaa3

File tree

13 files changed

+153
-32
lines changed

13 files changed

+153
-32
lines changed

src/driver/aurora-mysql/AuroraMysqlQueryRunner.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -404,13 +404,18 @@ export class AuroraMysqlQueryRunner
404404
/**
405405
* Creates a new view.
406406
*/
407-
async createView(view: View): Promise<void> {
407+
async createView(
408+
view: View,
409+
syncWithMetadata: boolean = false,
410+
): Promise<void> {
408411
const upQueries: Query[] = []
409412
const downQueries: Query[] = []
410413
upQueries.push(this.createViewSql(view))
411-
upQueries.push(await this.insertViewDefinitionSql(view))
414+
if (syncWithMetadata)
415+
upQueries.push(await this.insertViewDefinitionSql(view))
412416
downQueries.push(this.dropViewSql(view))
413-
downQueries.push(await this.deleteViewDefinitionSql(view))
417+
if (syncWithMetadata)
418+
downQueries.push(await this.deleteViewDefinitionSql(view))
414419
await this.executeQueries(upQueries, downQueries)
415420
}
416421

src/driver/cockroachdb/CockroachQueryRunner.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -678,13 +678,18 @@ export class CockroachQueryRunner
678678
/**
679679
* Creates a new view.
680680
*/
681-
async createView(view: View): Promise<void> {
681+
async createView(
682+
view: View,
683+
syncWithMetadata: boolean = false,
684+
): Promise<void> {
682685
const upQueries: Query[] = []
683686
const downQueries: Query[] = []
684687
upQueries.push(this.createViewSql(view))
685-
upQueries.push(await this.insertViewDefinitionSql(view))
688+
if (syncWithMetadata)
689+
upQueries.push(await this.insertViewDefinitionSql(view))
686690
downQueries.push(this.dropViewSql(view))
687-
downQueries.push(await this.deleteViewDefinitionSql(view))
691+
if (syncWithMetadata)
692+
downQueries.push(await this.deleteViewDefinitionSql(view))
688693
await this.executeQueries(upQueries, downQueries)
689694
}
690695

src/driver/mysql/MysqlQueryRunner.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,13 +529,18 @@ export class MysqlQueryRunner extends BaseQueryRunner implements QueryRunner {
529529
/**
530530
* Creates a new view.
531531
*/
532-
async createView(view: View): Promise<void> {
532+
async createView(
533+
view: View,
534+
syncWithMetadata: boolean = false,
535+
): Promise<void> {
533536
const upQueries: Query[] = []
534537
const downQueries: Query[] = []
535538
upQueries.push(this.createViewSql(view))
536-
upQueries.push(await this.insertViewDefinitionSql(view))
539+
if (syncWithMetadata)
540+
upQueries.push(await this.insertViewDefinitionSql(view))
537541
downQueries.push(this.dropViewSql(view))
538-
downQueries.push(await this.deleteViewDefinitionSql(view))
542+
if (syncWithMetadata)
543+
downQueries.push(await this.deleteViewDefinitionSql(view))
539544
await this.executeQueries(upQueries, downQueries)
540545
}
541546

src/driver/oracle/OracleQueryRunner.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -594,13 +594,17 @@ export class OracleQueryRunner extends BaseQueryRunner implements QueryRunner {
594594
/**
595595
* Creates a new view.
596596
*/
597-
async createView(view: View): Promise<void> {
597+
async createView(
598+
view: View,
599+
syncWithMetadata: boolean = false,
600+
): Promise<void> {
598601
const upQueries: Query[] = []
599602
const downQueries: Query[] = []
600603
upQueries.push(this.createViewSql(view))
601-
upQueries.push(this.insertViewDefinitionSql(view))
604+
if (syncWithMetadata) upQueries.push(this.insertViewDefinitionSql(view))
602605
downQueries.push(this.dropViewSql(view))
603-
downQueries.push(this.deleteViewDefinitionSql(view))
606+
if (syncWithMetadata)
607+
downQueries.push(this.deleteViewDefinitionSql(view))
604608
await this.executeQueries(upQueries, downQueries)
605609
}
606610

src/driver/postgres/PostgresQueryRunner.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -647,13 +647,18 @@ export class PostgresQueryRunner
647647
/**
648648
* Creates a new view.
649649
*/
650-
async createView(view: View): Promise<void> {
650+
async createView(
651+
view: View,
652+
syncWithMetadata: boolean = false,
653+
): Promise<void> {
651654
const upQueries: Query[] = []
652655
const downQueries: Query[] = []
653656
upQueries.push(this.createViewSql(view))
654-
upQueries.push(await this.insertViewDefinitionSql(view))
657+
if (syncWithMetadata)
658+
upQueries.push(await this.insertViewDefinitionSql(view))
655659
downQueries.push(this.dropViewSql(view))
656-
downQueries.push(await this.deleteViewDefinitionSql(view))
660+
if (syncWithMetadata)
661+
downQueries.push(await this.deleteViewDefinitionSql(view))
657662
await this.executeQueries(upQueries, downQueries)
658663
}
659664

src/driver/sap/SapQueryRunner.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -549,13 +549,18 @@ export class SapQueryRunner extends BaseQueryRunner implements QueryRunner {
549549
/**
550550
* Creates a new view.
551551
*/
552-
async createView(view: View): Promise<void> {
552+
async createView(
553+
view: View,
554+
syncWithMetadata: boolean = false,
555+
): Promise<void> {
553556
const upQueries: Query[] = []
554557
const downQueries: Query[] = []
555558
upQueries.push(this.createViewSql(view))
556-
upQueries.push(await this.insertViewDefinitionSql(view))
559+
if (syncWithMetadata)
560+
upQueries.push(await this.insertViewDefinitionSql(view))
557561
downQueries.push(this.dropViewSql(view))
558-
downQueries.push(await this.deleteViewDefinitionSql(view))
562+
if (syncWithMetadata)
563+
downQueries.push(await this.deleteViewDefinitionSql(view))
559564
await this.executeQueries(upQueries, downQueries)
560565
}
561566

src/driver/sqlite-abstract/AbstractSqliteQueryRunner.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -398,13 +398,17 @@ export abstract class AbstractSqliteQueryRunner
398398
/**
399399
* Creates a new view.
400400
*/
401-
async createView(view: View): Promise<void> {
401+
async createView(
402+
view: View,
403+
syncWithMetadata: boolean = false,
404+
): Promise<void> {
402405
const upQueries: Query[] = []
403406
const downQueries: Query[] = []
404407
upQueries.push(this.createViewSql(view))
405-
upQueries.push(this.insertViewDefinitionSql(view))
408+
if (syncWithMetadata) upQueries.push(this.insertViewDefinitionSql(view))
406409
downQueries.push(this.dropViewSql(view))
407-
downQueries.push(this.deleteViewDefinitionSql(view))
410+
if (syncWithMetadata)
411+
downQueries.push(this.deleteViewDefinitionSql(view))
408412
await this.executeQueries(upQueries, downQueries)
409413
}
410414

src/driver/sqlserver/SqlServerQueryRunner.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -721,13 +721,18 @@ export class SqlServerQueryRunner
721721
/**
722722
* Creates a new view.
723723
*/
724-
async createView(view: View): Promise<void> {
724+
async createView(
725+
view: View,
726+
syncWithMetadata: boolean = false,
727+
): Promise<void> {
725728
const upQueries: Query[] = []
726729
const downQueries: Query[] = []
727730
upQueries.push(this.createViewSql(view))
728-
upQueries.push(await this.insertViewDefinitionSql(view))
731+
if (syncWithMetadata)
732+
upQueries.push(await this.insertViewDefinitionSql(view))
729733
downQueries.push(this.dropViewSql(view))
730-
downQueries.push(await this.deleteViewDefinitionSql(view))
734+
if (syncWithMetadata)
735+
downQueries.push(await this.deleteViewDefinitionSql(view))
731736
await this.executeQueries(upQueries, downQueries)
732737
}
733738

src/migration/MigrationExecutor.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ export class MigrationExecutor {
7373
public async executeMigration(migration: Migration): Promise<Migration> {
7474
return this.withQueryRunner(async (queryRunner) => {
7575
await this.createMigrationsTableIfNotExist(queryRunner)
76+
77+
// create typeorm_metadata table if it's not created yet
78+
const schemaBuilder = this.connection.driver.createSchemaBuilder()
79+
if (InstanceChecker.isRdbmsSchemaBuilder(schemaBuilder)) {
80+
await schemaBuilder.createMetadataTableIfNecessary(queryRunner)
81+
}
82+
7683
await queryRunner.beforeMigration()
7784
await (migration.instance as any).up(queryRunner)
7885
await queryRunner.afterMigration()
@@ -144,6 +151,7 @@ export class MigrationExecutor {
144151
this.queryRunner || this.connection.createQueryRunner()
145152
// create migrations table if its not created yet
146153
await this.createMigrationsTableIfNotExist(queryRunner)
154+
147155
// get all migrations that are executed and saved in the database
148156
const executedMigrations = await this.loadExecutedMigrations(
149157
queryRunner,
@@ -181,12 +189,11 @@ export class MigrationExecutor {
181189
async executePendingMigrations(): Promise<Migration[]> {
182190
const queryRunner =
183191
this.queryRunner || this.connection.createQueryRunner()
184-
// create migrations table if its not created yet
192+
// create migrations table if it's not created yet
185193
await this.createMigrationsTableIfNotExist(queryRunner)
186194

187-
// create the typeorm_metadata table if necessary
195+
// create the typeorm_metadata table if it's not created yet
188196
const schemaBuilder = this.connection.driver.createSchemaBuilder()
189-
190197
if (InstanceChecker.isRdbmsSchemaBuilder(schemaBuilder)) {
191198
await schemaBuilder.createMetadataTableIfNecessary(queryRunner)
192199
}
@@ -336,9 +343,15 @@ export class MigrationExecutor {
336343
const queryRunner =
337344
this.queryRunner || this.connection.createQueryRunner()
338345

339-
// create migrations table if its not created yet
346+
// create migrations table if it's not created yet
340347
await this.createMigrationsTableIfNotExist(queryRunner)
341348

349+
// create typeorm_metadata table if it's not created yet
350+
const schemaBuilder = this.connection.driver.createSchemaBuilder()
351+
if (InstanceChecker.isRdbmsSchemaBuilder(schemaBuilder)) {
352+
await schemaBuilder.createMetadataTableIfNecessary(queryRunner)
353+
}
354+
342355
// get all migrations that are executed and saved in the database
343356
const executedMigrations = await this.loadExecutedMigrations(
344357
queryRunner,

src/query-runner/QueryRunner.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,11 @@ export interface QueryRunner {
252252
/**
253253
* Creates a new view.
254254
*/
255-
createView(view: View, oldView?: View): Promise<void>
255+
createView(
256+
view: View,
257+
syncWithMetadata?: boolean,
258+
oldView?: View,
259+
): Promise<void>
256260

257261
/**
258262
* Drops a view.

0 commit comments

Comments
 (0)