typeorm 0.3.6-dev.1197d1d → 0.3.6-dev.49cbe23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -13
- package/browser/cache/DbQueryResultCache.js +9 -1
- package/browser/cache/DbQueryResultCache.js.map +1 -1
- package/browser/cache/RedisQueryResultCache.js +3 -0
- package/browser/cache/RedisQueryResultCache.js.map +1 -1
- package/browser/data-source/DataSourceOptions.d.ts +2 -1
- package/browser/data-source/DataSourceOptions.js.map +1 -1
- package/browser/decorator/Index.js +1 -0
- package/browser/decorator/Index.js.map +1 -1
- package/browser/decorator/columns/PrimaryColumn.js +4 -1
- package/browser/decorator/columns/PrimaryColumn.js.map +1 -1
- package/browser/decorator/options/ColumnOptions.d.ts +2 -2
- package/browser/decorator/options/ColumnOptions.js.map +1 -1
- package/browser/decorator/options/IndexOptions.d.ts +8 -0
- package/browser/decorator/options/IndexOptions.js.map +1 -1
- package/browser/driver/DriverFactory.js +4 -0
- package/browser/driver/DriverFactory.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachDriver.js +4 -1
- package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/browser/driver/cockroachdb/CockroachQueryRunner.js +133 -11
- package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/browser/driver/mysql/MysqlDriver.d.ts +1 -0
- package/browser/driver/mysql/MysqlDriver.js +94 -23
- package/browser/driver/mysql/MysqlDriver.js.map +1 -1
- package/browser/driver/mysql/MysqlQueryRunner.js +203 -24
- package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/browser/driver/oracle/OracleDriver.js +79 -15
- package/browser/driver/oracle/OracleDriver.js.map +1 -1
- package/browser/driver/oracle/OracleQueryRunner.js +118 -21
- package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/browser/driver/postgres/PostgresDriver.js +95 -18
- package/browser/driver/postgres/PostgresDriver.js.map +1 -1
- package/browser/driver/postgres/PostgresQueryRunner.js +60 -38
- package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/browser/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
- package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js +3 -0
- package/browser/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
- package/browser/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
- package/browser/driver/spanner/SpannerConnectionOptions.js +3 -0
- package/browser/driver/spanner/SpannerConnectionOptions.js.map +1 -0
- package/browser/driver/spanner/SpannerDriver.d.ts +241 -0
- package/browser/driver/spanner/SpannerDriver.js +604 -0
- package/browser/driver/spanner/SpannerDriver.js.map +1 -0
- package/browser/driver/spanner/SpannerQueryRunner.d.ts +350 -0
- package/browser/driver/spanner/SpannerQueryRunner.js +1445 -0
- package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -0
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +21 -16
- package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +165 -20
- package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerDriver.d.ts +3 -1
- package/browser/driver/sqlserver/SqlServerDriver.js +99 -26
- package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/browser/driver/sqlserver/SqlServerQueryRunner.js +153 -17
- package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
- package/browser/driver/types/ColumnTypes.d.ts +1 -1
- package/browser/driver/types/ColumnTypes.js.map +1 -1
- package/browser/driver/types/DatabaseType.d.ts +1 -1
- package/browser/driver/types/DatabaseType.js.map +1 -1
- package/browser/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
- package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
- package/browser/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
- package/browser/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
- package/browser/entity-schema/EntitySchemaTransformer.js +1 -0
- package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/browser/find-options/FindOneOptions.d.ts +1 -1
- package/browser/find-options/FindOneOptions.js.map +1 -1
- package/browser/find-options/FindOptionsUtils.d.ts +2 -1
- package/browser/find-options/FindOptionsUtils.js +2 -1
- package/browser/find-options/FindOptionsUtils.js.map +1 -1
- package/browser/logger/AdvancedConsoleLogger.d.ts +1 -1
- package/browser/logger/AdvancedConsoleLogger.js +1 -1
- package/browser/logger/AdvancedConsoleLogger.js.map +1 -1
- package/browser/metadata/ColumnMetadata.d.ts +2 -2
- package/browser/metadata/ColumnMetadata.js.map +1 -1
- package/browser/metadata/IndexMetadata.d.ts +8 -0
- package/browser/metadata/IndexMetadata.js +9 -0
- package/browser/metadata/IndexMetadata.js.map +1 -1
- package/browser/metadata-args/IndexMetadataArgs.d.ts +8 -0
- package/browser/metadata-args/IndexMetadataArgs.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataBuilder.js +13 -6
- package/browser/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/browser/metadata-builder/EntityMetadataValidator.js +8 -0
- package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
- package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/browser/platform/PlatformTools.js +5 -0
- package/browser/platform/PlatformTools.js.map +1 -1
- package/browser/query-builder/InsertQueryBuilder.js +15 -3
- package/browser/query-builder/InsertQueryBuilder.js.map +1 -1
- package/browser/query-builder/QueryExpressionMap.d.ts +1 -1
- package/browser/query-builder/QueryExpressionMap.js.map +1 -1
- package/browser/query-builder/SelectQueryBuilder.d.ts +1 -1
- package/browser/query-builder/SelectQueryBuilder.js +25 -4
- package/browser/query-builder/SelectQueryBuilder.js.map +1 -1
- package/browser/query-builder/UpdateQueryBuilder.js +18 -7
- package/browser/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/browser/query-runner/BaseQueryRunner.d.ts +10 -0
- package/browser/query-runner/BaseQueryRunner.js +25 -1
- package/browser/query-runner/BaseQueryRunner.js.map +1 -1
- package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
- package/browser/schema-builder/RdbmsSchemaBuilder.js +26 -6
- package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/browser/schema-builder/options/TableColumnOptions.d.ts +2 -2
- package/browser/schema-builder/options/TableColumnOptions.js.map +1 -1
- package/browser/schema-builder/options/TableIndexOptions.d.ts +8 -0
- package/browser/schema-builder/options/TableIndexOptions.js.map +1 -1
- package/browser/schema-builder/table/TableColumn.d.ts +2 -2
- package/browser/schema-builder/table/TableColumn.js.map +1 -1
- package/browser/schema-builder/table/TableIndex.d.ts +8 -0
- package/browser/schema-builder/table/TableIndex.js +3 -0
- package/browser/schema-builder/table/TableIndex.js.map +1 -1
- package/cache/DbQueryResultCache.js +9 -1
- package/cache/DbQueryResultCache.js.map +1 -1
- package/cache/RedisQueryResultCache.js +3 -0
- package/cache/RedisQueryResultCache.js.map +1 -1
- package/commands/InitCommand.js +1 -1
- package/commands/InitCommand.js.map +1 -1
- package/commands/MigrationGenerateCommand.js +3 -2
- package/commands/MigrationGenerateCommand.js.map +1 -1
- package/data-source/DataSourceOptions.d.ts +2 -1
- package/data-source/DataSourceOptions.js.map +1 -1
- package/decorator/Index.js +1 -0
- package/decorator/Index.js.map +1 -1
- package/decorator/columns/PrimaryColumn.js +4 -1
- package/decorator/columns/PrimaryColumn.js.map +1 -1
- package/decorator/options/ColumnOptions.d.ts +2 -2
- package/decorator/options/ColumnOptions.js.map +1 -1
- package/decorator/options/IndexOptions.d.ts +8 -0
- package/decorator/options/IndexOptions.js.map +1 -1
- package/driver/DriverFactory.js +4 -0
- package/driver/DriverFactory.js.map +1 -1
- package/driver/cockroachdb/CockroachDriver.js +4 -1
- package/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/driver/cockroachdb/CockroachQueryRunner.js +133 -11
- package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/driver/mysql/MysqlDriver.d.ts +1 -0
- package/driver/mysql/MysqlDriver.js +94 -23
- package/driver/mysql/MysqlDriver.js.map +1 -1
- package/driver/mysql/MysqlQueryRunner.js +203 -24
- package/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/driver/oracle/OracleDriver.js +79 -15
- package/driver/oracle/OracleDriver.js.map +1 -1
- package/driver/oracle/OracleQueryRunner.js +118 -21
- package/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/driver/postgres/PostgresDriver.js +95 -18
- package/driver/postgres/PostgresDriver.js.map +1 -1
- package/driver/postgres/PostgresQueryRunner.js +60 -38
- package/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/driver/spanner/SpannerConnectionCredentialsOptions.d.ts +17 -0
- package/driver/spanner/SpannerConnectionCredentialsOptions.js +4 -0
- package/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -0
- package/driver/spanner/SpannerConnectionOptions.d.ts +120 -0
- package/driver/spanner/SpannerConnectionOptions.js +4 -0
- package/driver/spanner/SpannerConnectionOptions.js.map +1 -0
- package/driver/spanner/SpannerDriver.d.ts +241 -0
- package/driver/spanner/SpannerDriver.js +608 -0
- package/driver/spanner/SpannerDriver.js.map +1 -0
- package/driver/spanner/SpannerQueryRunner.d.ts +350 -0
- package/driver/spanner/SpannerQueryRunner.js +1449 -0
- package/driver/spanner/SpannerQueryRunner.js.map +1 -0
- package/driver/sqlite-abstract/AbstractSqliteDriver.js +21 -16
- package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +165 -20
- package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
- package/driver/sqlserver/SqlServerDriver.d.ts +3 -1
- package/driver/sqlserver/SqlServerDriver.js +99 -26
- package/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/driver/sqlserver/SqlServerQueryRunner.js +153 -17
- package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
- package/driver/types/ColumnTypes.d.ts +1 -1
- package/driver/types/ColumnTypes.js.map +1 -1
- package/driver/types/DatabaseType.d.ts +1 -1
- package/driver/types/DatabaseType.js.map +1 -1
- package/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
- package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
- package/entity-schema/EntitySchemaIndexOptions.d.ts +8 -0
- package/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
- package/entity-schema/EntitySchemaTransformer.js +1 -0
- package/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/find-options/FindOneOptions.d.ts +1 -1
- package/find-options/FindOneOptions.js.map +1 -1
- package/find-options/FindOptionsUtils.d.ts +2 -1
- package/find-options/FindOptionsUtils.js +2 -1
- package/find-options/FindOptionsUtils.js.map +1 -1
- package/logger/AdvancedConsoleLogger.d.ts +1 -1
- package/logger/AdvancedConsoleLogger.js +1 -1
- package/logger/AdvancedConsoleLogger.js.map +1 -1
- package/metadata/ColumnMetadata.d.ts +2 -2
- package/metadata/ColumnMetadata.js.map +1 -1
- package/metadata/IndexMetadata.d.ts +8 -0
- package/metadata/IndexMetadata.js +9 -0
- package/metadata/IndexMetadata.js.map +1 -1
- package/metadata-args/IndexMetadataArgs.d.ts +8 -0
- package/metadata-args/IndexMetadataArgs.js.map +1 -1
- package/metadata-builder/EntityMetadataBuilder.js +13 -6
- package/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/metadata-builder/EntityMetadataValidator.js +8 -0
- package/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/metadata-builder/JunctionEntityMetadataBuilder.js +13 -6
- package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/package.json +1 -1
- package/platform/PlatformTools.js +5 -0
- package/platform/PlatformTools.js.map +1 -1
- package/query-builder/InsertQueryBuilder.js +15 -3
- package/query-builder/InsertQueryBuilder.js.map +1 -1
- package/query-builder/QueryExpressionMap.d.ts +1 -1
- package/query-builder/QueryExpressionMap.js.map +1 -1
- package/query-builder/SelectQueryBuilder.d.ts +1 -1
- package/query-builder/SelectQueryBuilder.js +25 -4
- package/query-builder/SelectQueryBuilder.js.map +1 -1
- package/query-builder/UpdateQueryBuilder.js +18 -7
- package/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/query-runner/BaseQueryRunner.d.ts +10 -0
- package/query-runner/BaseQueryRunner.js +25 -1
- package/query-runner/BaseQueryRunner.js.map +1 -1
- package/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
- package/schema-builder/RdbmsSchemaBuilder.js +26 -6
- package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/schema-builder/options/TableColumnOptions.d.ts +2 -2
- package/schema-builder/options/TableColumnOptions.js.map +1 -1
- package/schema-builder/options/TableIndexOptions.d.ts +8 -0
- package/schema-builder/options/TableIndexOptions.js.map +1 -1
- package/schema-builder/table/TableColumn.d.ts +2 -2
- package/schema-builder/table/TableColumn.js.map +1 -1
- package/schema-builder/table/TableIndex.d.ts +8 -0
- package/schema-builder/table/TableIndex.js +3 -0
- package/schema-builder/table/TableIndex.js.map +1 -1
|
@@ -315,6 +315,26 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
315
315
|
// createTable does not need separate method to create foreign keys, because it create fk's in the same query with table creation.
|
|
316
316
|
if (createForeignKeys)
|
|
317
317
|
table.foreignKeys.forEach((foreignKey) => downQueries.push(this.dropForeignKeySql(table, foreignKey)));
|
|
318
|
+
// if table has column with generated type, we must add the expression to the metadata table
|
|
319
|
+
const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
|
|
320
|
+
for (const column of generatedColumns) {
|
|
321
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
322
|
+
const insertQuery = this.insertTypeormMetadataSql({
|
|
323
|
+
schema: currentDatabase,
|
|
324
|
+
table: table.name,
|
|
325
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
326
|
+
name: column.name,
|
|
327
|
+
value: column.asExpression,
|
|
328
|
+
});
|
|
329
|
+
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
330
|
+
schema: currentDatabase,
|
|
331
|
+
table: table.name,
|
|
332
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
333
|
+
name: column.name,
|
|
334
|
+
});
|
|
335
|
+
upQueries.push(insertQuery);
|
|
336
|
+
downQueries.push(deleteQuery);
|
|
337
|
+
}
|
|
318
338
|
return this.executeQueries(upQueries, downQueries);
|
|
319
339
|
}
|
|
320
340
|
/**
|
|
@@ -339,6 +359,26 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
339
359
|
table.indices.forEach((index) => upQueries.push(this.dropIndexSql(table, index)));
|
|
340
360
|
upQueries.push(this.dropTableSql(table));
|
|
341
361
|
downQueries.push(this.createTableSql(table, createForeignKeys));
|
|
362
|
+
// if table had columns with generated type, we must remove the expression from the metadata table
|
|
363
|
+
const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
|
|
364
|
+
for (const column of generatedColumns) {
|
|
365
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
366
|
+
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
367
|
+
schema: currentDatabase,
|
|
368
|
+
table: table.name,
|
|
369
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
370
|
+
name: column.name,
|
|
371
|
+
});
|
|
372
|
+
const insertQuery = this.insertTypeormMetadataSql({
|
|
373
|
+
schema: currentDatabase,
|
|
374
|
+
table: table.name,
|
|
375
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
376
|
+
name: column.name,
|
|
377
|
+
value: column.asExpression,
|
|
378
|
+
});
|
|
379
|
+
upQueries.push(deleteQuery);
|
|
380
|
+
downQueries.push(insertQuery);
|
|
381
|
+
}
|
|
342
382
|
await this.executeQueries(upQueries, downQueries);
|
|
343
383
|
}
|
|
344
384
|
/**
|
|
@@ -484,6 +524,24 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
484
524
|
downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${column.name}\` ${this.buildCreateColumnSql(nonGeneratedColumn, true)}`));
|
|
485
525
|
}
|
|
486
526
|
}
|
|
527
|
+
if (column.generatedType && column.asExpression) {
|
|
528
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
529
|
+
const insertQuery = this.insertTypeormMetadataSql({
|
|
530
|
+
schema: currentDatabase,
|
|
531
|
+
table: table.name,
|
|
532
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
533
|
+
name: column.name,
|
|
534
|
+
value: column.asExpression,
|
|
535
|
+
});
|
|
536
|
+
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
537
|
+
schema: currentDatabase,
|
|
538
|
+
table: table.name,
|
|
539
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
540
|
+
name: column.name,
|
|
541
|
+
});
|
|
542
|
+
upQueries.push(insertQuery);
|
|
543
|
+
downQueries.push(deleteQuery);
|
|
544
|
+
}
|
|
487
545
|
// create column index
|
|
488
546
|
const columnIndex = clonedTable.indices.find((index) => index.columnNames.length === 1 &&
|
|
489
547
|
index.columnNames[0] === column.name);
|
|
@@ -560,7 +618,12 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
560
618
|
newColumn.generationStrategy !== "uuid") ||
|
|
561
619
|
oldColumn.type !== newColumn.type ||
|
|
562
620
|
oldColumn.length !== newColumn.length ||
|
|
563
|
-
oldColumn.generatedType
|
|
621
|
+
(oldColumn.generatedType &&
|
|
622
|
+
newColumn.generatedType &&
|
|
623
|
+
oldColumn.generatedType !== newColumn.generatedType) ||
|
|
624
|
+
(!oldColumn.generatedType &&
|
|
625
|
+
newColumn.generatedType === "VIRTUAL") ||
|
|
626
|
+
(oldColumn.generatedType === "VIRTUAL" && !newColumn.generatedType)) {
|
|
564
627
|
await this.dropColumn(table, oldColumn);
|
|
565
628
|
await this.addColumn(table, newColumn);
|
|
566
629
|
// update cloned table
|
|
@@ -636,6 +699,77 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
636
699
|
if (this.isColumnChanged(oldColumn, newColumn, true, true)) {
|
|
637
700
|
upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${oldColumn.name}\` ${this.buildCreateColumnSql(newColumn, true)}`));
|
|
638
701
|
downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} CHANGE \`${newColumn.name}\` ${this.buildCreateColumnSql(oldColumn, true)}`));
|
|
702
|
+
if (oldColumn.generatedType && !newColumn.generatedType) {
|
|
703
|
+
// if column changed from generated to non-generated, delete record from typeorm metadata
|
|
704
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
705
|
+
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
706
|
+
schema: currentDatabase,
|
|
707
|
+
table: table.name,
|
|
708
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
709
|
+
name: oldColumn.name,
|
|
710
|
+
});
|
|
711
|
+
const insertQuery = this.insertTypeormMetadataSql({
|
|
712
|
+
schema: currentDatabase,
|
|
713
|
+
table: table.name,
|
|
714
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
715
|
+
name: oldColumn.name,
|
|
716
|
+
value: oldColumn.asExpression,
|
|
717
|
+
});
|
|
718
|
+
upQueries.push(deleteQuery);
|
|
719
|
+
downQueries.push(insertQuery);
|
|
720
|
+
}
|
|
721
|
+
else if (!oldColumn.generatedType &&
|
|
722
|
+
newColumn.generatedType) {
|
|
723
|
+
// if column changed from non-generated to generated, insert record into typeorm metadata
|
|
724
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
725
|
+
const insertQuery = this.insertTypeormMetadataSql({
|
|
726
|
+
schema: currentDatabase,
|
|
727
|
+
table: table.name,
|
|
728
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
729
|
+
name: newColumn.name,
|
|
730
|
+
value: newColumn.asExpression,
|
|
731
|
+
});
|
|
732
|
+
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
733
|
+
schema: currentDatabase,
|
|
734
|
+
table: table.name,
|
|
735
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
736
|
+
name: newColumn.name,
|
|
737
|
+
});
|
|
738
|
+
upQueries.push(insertQuery);
|
|
739
|
+
downQueries.push(deleteQuery);
|
|
740
|
+
}
|
|
741
|
+
else if (oldColumn.asExpression !== newColumn.asExpression) {
|
|
742
|
+
// if only expression changed, just update it in typeorm_metadata table
|
|
743
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
744
|
+
const updateQuery = this.connection
|
|
745
|
+
.createQueryBuilder()
|
|
746
|
+
.update(this.getTypeormMetadataTableName())
|
|
747
|
+
.set({ value: newColumn.asExpression })
|
|
748
|
+
.where("`type` = :type", {
|
|
749
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
750
|
+
})
|
|
751
|
+
.andWhere("`name` = :name", { name: oldColumn.name })
|
|
752
|
+
.andWhere("`schema` = :schema", {
|
|
753
|
+
schema: currentDatabase,
|
|
754
|
+
})
|
|
755
|
+
.andWhere("`table` = :table", { table: table.name })
|
|
756
|
+
.getQueryAndParameters();
|
|
757
|
+
const revertUpdateQuery = this.connection
|
|
758
|
+
.createQueryBuilder()
|
|
759
|
+
.update(this.getTypeormMetadataTableName())
|
|
760
|
+
.set({ value: oldColumn.asExpression })
|
|
761
|
+
.where("`type` = :type", {
|
|
762
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
763
|
+
})
|
|
764
|
+
.andWhere("`name` = :name", { name: newColumn.name })
|
|
765
|
+
.andWhere("`schema` = :schema", {
|
|
766
|
+
schema: currentDatabase,
|
|
767
|
+
})
|
|
768
|
+
.andWhere("`table` = :table", { table: table.name })
|
|
769
|
+
.getQueryAndParameters();
|
|
770
|
+
upQueries.push(new Query(updateQuery[0], updateQuery[1]));
|
|
771
|
+
downQueries.push(new Query(revertUpdateQuery[0], revertUpdateQuery[1]));
|
|
772
|
+
}
|
|
639
773
|
}
|
|
640
774
|
if (newColumn.isPrimary !== oldColumn.isPrimary) {
|
|
641
775
|
// if table have generated column, we must drop AUTO_INCREMENT before changing primary constraints.
|
|
@@ -814,6 +948,24 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
814
948
|
}
|
|
815
949
|
upQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} DROP COLUMN \`${column.name}\``));
|
|
816
950
|
downQueries.push(new Query(`ALTER TABLE ${this.escapePath(table)} ADD ${this.buildCreateColumnSql(column, true)}`));
|
|
951
|
+
if (column.generatedType && column.asExpression) {
|
|
952
|
+
const currentDatabase = await this.getCurrentDatabase();
|
|
953
|
+
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
954
|
+
schema: currentDatabase,
|
|
955
|
+
table: table.name,
|
|
956
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
957
|
+
name: column.name,
|
|
958
|
+
});
|
|
959
|
+
const insertQuery = this.insertTypeormMetadataSql({
|
|
960
|
+
schema: currentDatabase,
|
|
961
|
+
table: table.name,
|
|
962
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
963
|
+
name: column.name,
|
|
964
|
+
value: column.asExpression,
|
|
965
|
+
});
|
|
966
|
+
upQueries.push(deleteQuery);
|
|
967
|
+
downQueries.push(insertQuery);
|
|
968
|
+
}
|
|
817
969
|
await this.executeQueries(upQueries, downQueries);
|
|
818
970
|
clonedTable.removeColumn(column);
|
|
819
971
|
this.replaceCachedTable(table, clonedTable);
|
|
@@ -1349,11 +1501,12 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1349
1501
|
table.database = dbTable["TABLE_SCHEMA"];
|
|
1350
1502
|
table.name = this.driver.buildTableName(dbTable["TABLE_NAME"], undefined, db);
|
|
1351
1503
|
// create columns from the loaded columns
|
|
1352
|
-
table.columns = dbColumns
|
|
1353
|
-
.filter((dbColumn) => dbColumn["TABLE_NAME"] ===
|
|
1504
|
+
table.columns = await Promise.all(dbColumns
|
|
1505
|
+
.filter((dbColumn) => dbColumn["TABLE_NAME"] ===
|
|
1506
|
+
dbTable["TABLE_NAME"] &&
|
|
1354
1507
|
dbColumn["TABLE_SCHEMA"] ===
|
|
1355
1508
|
dbTable["TABLE_SCHEMA"])
|
|
1356
|
-
.map((dbColumn) => {
|
|
1509
|
+
.map(async (dbColumn) => {
|
|
1357
1510
|
const columnUniqueIndices = dbIndices.filter((dbIndex) => {
|
|
1358
1511
|
return (dbIndex["TABLE_NAME"] ===
|
|
1359
1512
|
dbTable["TABLE_NAME"] &&
|
|
@@ -1361,7 +1514,8 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1361
1514
|
dbTable["TABLE_SCHEMA"] &&
|
|
1362
1515
|
dbIndex["COLUMN_NAME"] ===
|
|
1363
1516
|
dbColumn["COLUMN_NAME"] &&
|
|
1364
|
-
parseInt(dbIndex["NON_UNIQUE"], 10) ===
|
|
1517
|
+
parseInt(dbIndex["NON_UNIQUE"], 10) ===
|
|
1518
|
+
0);
|
|
1365
1519
|
});
|
|
1366
1520
|
const tableMetadata = this.connection.entityMetadatas.find((metadata) => this.getTablePath(table) ===
|
|
1367
1521
|
this.getTablePath(metadata));
|
|
@@ -1382,9 +1536,11 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1382
1536
|
});
|
|
1383
1537
|
const tableColumn = new TableColumn();
|
|
1384
1538
|
tableColumn.name = dbColumn["COLUMN_NAME"];
|
|
1385
|
-
tableColumn.type =
|
|
1539
|
+
tableColumn.type =
|
|
1540
|
+
dbColumn["DATA_TYPE"].toLowerCase();
|
|
1386
1541
|
tableColumn.zerofill =
|
|
1387
|
-
dbColumn["COLUMN_TYPE"].indexOf("zerofill") !==
|
|
1542
|
+
dbColumn["COLUMN_TYPE"].indexOf("zerofill") !==
|
|
1543
|
+
-1;
|
|
1388
1544
|
tableColumn.unsigned = tableColumn.zerofill
|
|
1389
1545
|
? true
|
|
1390
1546
|
: dbColumn["COLUMN_TYPE"].indexOf("unsigned") !== -1;
|
|
@@ -1398,7 +1554,8 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1398
1554
|
}
|
|
1399
1555
|
if (dbColumn["COLUMN_DEFAULT"] === null ||
|
|
1400
1556
|
dbColumn["COLUMN_DEFAULT"] === undefined ||
|
|
1401
|
-
(isMariaDb &&
|
|
1557
|
+
(isMariaDb &&
|
|
1558
|
+
dbColumn["COLUMN_DEFAULT"] === "NULL")) {
|
|
1402
1559
|
tableColumn.default = undefined;
|
|
1403
1560
|
}
|
|
1404
1561
|
else if (/^CURRENT_TIMESTAMP(\([0-9]*\))?$/i.test(dbColumn["COLUMN_DEFAULT"])) {
|
|
@@ -1420,23 +1577,41 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1420
1577
|
// New versions of MariaDB return expressions in lowercase. We need to set it in
|
|
1421
1578
|
// uppercase so the comparison in MysqlDriver#compareExtraValues does not fail.
|
|
1422
1579
|
tableColumn.onUpdate = dbColumn["EXTRA"]
|
|
1423
|
-
.substring(dbColumn["EXTRA"].indexOf("on update") +
|
|
1580
|
+
.substring(dbColumn["EXTRA"].indexOf("on update") +
|
|
1581
|
+
10)
|
|
1424
1582
|
.toUpperCase();
|
|
1425
1583
|
}
|
|
1426
1584
|
if (dbColumn["GENERATION_EXPRESSION"]) {
|
|
1427
|
-
tableColumn.asExpression =
|
|
1428
|
-
dbColumn["GENERATION_EXPRESSION"];
|
|
1429
1585
|
tableColumn.generatedType =
|
|
1430
1586
|
dbColumn["EXTRA"].indexOf("VIRTUAL") !== -1
|
|
1431
1587
|
? "VIRTUAL"
|
|
1432
1588
|
: "STORED";
|
|
1589
|
+
// We cannot relay on information_schema.columns.generation_expression, because it is formatted different.
|
|
1590
|
+
const asExpressionQuery = await this.selectTypeormMetadataSql({
|
|
1591
|
+
schema: dbTable["TABLE_SCHEMA"],
|
|
1592
|
+
table: dbTable["TABLE_NAME"],
|
|
1593
|
+
type: MetadataTableType.GENERATED_COLUMN,
|
|
1594
|
+
name: tableColumn.name,
|
|
1595
|
+
});
|
|
1596
|
+
const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
|
|
1597
|
+
if (results[0] && results[0].value) {
|
|
1598
|
+
tableColumn.asExpression = results[0].value;
|
|
1599
|
+
}
|
|
1600
|
+
else {
|
|
1601
|
+
tableColumn.asExpression = "";
|
|
1602
|
+
}
|
|
1433
1603
|
}
|
|
1434
1604
|
tableColumn.isUnique =
|
|
1435
1605
|
columnUniqueIndices.length > 0 &&
|
|
1436
1606
|
!hasIgnoredIndex &&
|
|
1437
1607
|
!isConstraintComposite;
|
|
1438
|
-
tableColumn.
|
|
1439
|
-
|
|
1608
|
+
if (isMariaDb && tableColumn.generatedType) {
|
|
1609
|
+
// do nothing - MariaDB does not support NULL/NOT NULL expressions for generated columns
|
|
1610
|
+
}
|
|
1611
|
+
else {
|
|
1612
|
+
tableColumn.isNullable =
|
|
1613
|
+
dbColumn["IS_NULLABLE"] === "YES";
|
|
1614
|
+
}
|
|
1440
1615
|
tableColumn.isPrimary = dbPrimaryKeys.some((dbPrimaryKey) => {
|
|
1441
1616
|
return (dbPrimaryKey["TABLE_NAME"] ===
|
|
1442
1617
|
dbColumn["TABLE_NAME"] &&
|
|
@@ -1446,11 +1621,13 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1446
1621
|
dbColumn["COLUMN_NAME"]);
|
|
1447
1622
|
});
|
|
1448
1623
|
tableColumn.isGenerated =
|
|
1449
|
-
dbColumn["EXTRA"].indexOf("auto_increment") !==
|
|
1624
|
+
dbColumn["EXTRA"].indexOf("auto_increment") !==
|
|
1625
|
+
-1;
|
|
1450
1626
|
if (tableColumn.isGenerated)
|
|
1451
1627
|
tableColumn.generationStrategy = "increment";
|
|
1452
1628
|
tableColumn.comment =
|
|
1453
|
-
typeof dbColumn["COLUMN_COMMENT"] ===
|
|
1629
|
+
typeof dbColumn["COLUMN_COMMENT"] ===
|
|
1630
|
+
"string" &&
|
|
1454
1631
|
dbColumn["COLUMN_COMMENT"].length === 0
|
|
1455
1632
|
? undefined
|
|
1456
1633
|
: dbColumn["COLUMN_COMMENT"];
|
|
@@ -1462,16 +1639,18 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1462
1639
|
: dbColumn["CHARACTER_SET_NAME"];
|
|
1463
1640
|
if (dbColumn["COLLATION_NAME"])
|
|
1464
1641
|
tableColumn.collation =
|
|
1465
|
-
dbColumn["COLLATION_NAME"] ===
|
|
1642
|
+
dbColumn["COLLATION_NAME"] ===
|
|
1643
|
+
defaultCollation
|
|
1466
1644
|
? undefined
|
|
1467
1645
|
: dbColumn["COLLATION_NAME"];
|
|
1468
1646
|
// check only columns that have length property
|
|
1469
1647
|
if (this.driver.withLengthColumnTypes.indexOf(tableColumn.type) !== -1 &&
|
|
1470
1648
|
dbColumn["CHARACTER_MAXIMUM_LENGTH"]) {
|
|
1471
1649
|
const length = dbColumn["CHARACTER_MAXIMUM_LENGTH"].toString();
|
|
1472
|
-
tableColumn.length =
|
|
1473
|
-
|
|
1474
|
-
|
|
1650
|
+
tableColumn.length =
|
|
1651
|
+
!this.isDefaultColumnLength(table, tableColumn, length)
|
|
1652
|
+
? length
|
|
1653
|
+
: "";
|
|
1475
1654
|
}
|
|
1476
1655
|
if (tableColumn.type === "decimal" ||
|
|
1477
1656
|
tableColumn.type === "double" ||
|
|
@@ -1504,7 +1683,7 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1504
1683
|
tableColumn.precision = parseInt(dbColumn["DATETIME_PRECISION"]);
|
|
1505
1684
|
}
|
|
1506
1685
|
return tableColumn;
|
|
1507
|
-
});
|
|
1686
|
+
}));
|
|
1508
1687
|
// find foreign key constraints of table, group them by constraint name and build TableForeignKey.
|
|
1509
1688
|
const tableForeignKeyConstraints = OrmUtils.uniq(dbForeignKeys.filter((dbForeignKey) => {
|
|
1510
1689
|
return (dbForeignKey["TABLE_NAME"] ===
|
|
@@ -1801,6 +1980,10 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1801
1980
|
else {
|
|
1802
1981
|
c = `\`${column.name}\` ${this.connection.driver.createFullType(column)}`;
|
|
1803
1982
|
}
|
|
1983
|
+
if (column.charset)
|
|
1984
|
+
c += ` CHARACTER SET "${column.charset}"`;
|
|
1985
|
+
if (column.collation)
|
|
1986
|
+
c += ` COLLATE "${column.collation}"`;
|
|
1804
1987
|
if (column.asExpression)
|
|
1805
1988
|
c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "VIRTUAL"}`;
|
|
1806
1989
|
// if you specify ZEROFILL for a numeric column, MySQL automatically adds the UNSIGNED attribute to that column.
|
|
@@ -1814,10 +1997,6 @@ export class MysqlQueryRunner extends BaseQueryRunner {
|
|
|
1814
1997
|
c += ` (${column.enum
|
|
1815
1998
|
.map((value) => "'" + value.replace(/'/g, "''") + "'")
|
|
1816
1999
|
.join(", ")})`;
|
|
1817
|
-
if (column.charset)
|
|
1818
|
-
c += ` CHARACTER SET "${column.charset}"`;
|
|
1819
|
-
if (column.collation)
|
|
1820
|
-
c += ` COLLATE "${column.collation}"`;
|
|
1821
2000
|
const isMariaDb = this.driver.options.type === "mariadb";
|
|
1822
2001
|
if (isMariaDb &&
|
|
1823
2002
|
column.asExpression &&
|