UNPKG

typeorm

Version:

Data-Mapper ORM for TypeScript and ES2023+. Supports MySQL/MariaDB, PostgreSQL, MS SQL Server, Oracle, SAP HANA, SQLite, MongoDB databases.

175 lines (174 loc) 6.69 kB
import { Table } from "./table/Table"; import type { QueryRunner } from "../query-runner/QueryRunner"; import type { ColumnMetadata } from "../metadata/ColumnMetadata"; import type { EntityMetadata } from "../metadata/EntityMetadata"; import type { DataSource } from "../data-source/DataSource"; import type { SchemaBuilder } from "./SchemaBuilder"; import type { SqlInMemory } from "../driver/SqlInMemory"; import type { TableColumnOptions } from "./options/TableColumnOptions"; import { View } from "./view/View"; /** * Creates complete tables schemas in the database based on the entity metadatas. * * Steps how schema is being built: * 1. load list of all tables with complete column and keys information from the db * 2. drop all (old) foreign keys that exist in the table, but does not exist in the metadata * 3. create new tables that does not exist in the db, but exist in the metadata * 4. drop all columns exist (left old) in the db table, but does not exist in the metadata * 5. add columns from metadata which does not exist in the table * 6. update all exist columns which metadata has changed * 7. update primary keys - update old and create new primary key from changed columns * 8. create foreign keys which does not exist in the table yet * 9. create indices which are missing in db yet, and drops indices which exist in the db, but does not exist in the metadata anymore */ export declare class RdbmsSchemaBuilder implements SchemaBuilder { protected dataSource: DataSource; readonly "@instanceof": symbol; /** * Used to execute schema creation queries in a single connection. */ protected queryRunner: QueryRunner; /** * All tables loaded from the database for the current sync operation. */ protected tables: Table[]; /** * All views loaded from the database for the current sync operation. */ protected views: View[]; private currentDatabase?; private currentSchema?; constructor(dataSource: DataSource); /** * Creates complete schemas for the given entity metadatas. */ build(): Promise<void>; /** * Create the typeorm_metadata table if necessary. * * @param queryRunner */ createMetadataTableIfNecessary(queryRunner: QueryRunner): Promise<void>; /** * Returns sql queries to be executed by schema builder. */ log(): Promise<SqlInMemory>; /** * Returns only entities that should be synced in the database. */ protected get entityToSyncMetadatas(): EntityMetadata[]; /** * Returns only entities that should be synced in the database. */ protected get viewEntityToSyncMetadatas(): EntityMetadata[]; /** * Checks if there are at least one generated column. */ protected hasGeneratedColumns(): boolean; /** * Executes schema sync operations in a proper order. * Order of operations matter here. */ protected executeSchemaSyncOperationsInProperOrder(): Promise<void>; private getTablePath; /** * Drops all (old) foreign keys that exist in the tables, but do not exist in the entity metadata. */ protected dropOldForeignKeys(): Promise<void>; /** * Renames columns. * Works if only one column per table was changed. * Changes only column name. If something besides name was changed, these changes will be ignored. */ protected renameColumns(): Promise<void>; private shouldDropIndices; protected dropOldIndices(): Promise<void>; protected dropOldChecks(): Promise<void>; protected dropCompositeUniqueConstraints(): Promise<void>; protected dropOldExclusions(): Promise<void>; /** * change table comment */ protected changeTableComment(): Promise<void>; /** * Creates tables that do not exist in the database yet. * New tables are created without foreign and primary keys. * Primary key only can be created in conclusion with auto generated column. */ protected createNewTables(): Promise<void>; protected createViews(): Promise<void>; protected dropOldViews(): Promise<void>; /** * Drops all columns that exist in the table, but does not exist in the metadata (left old). * We drop their keys too, since it should be safe. */ protected dropRemovedColumns(): Promise<void>; /** * Adds columns from metadata which does not exist in the table. * Columns are created without keys. */ protected addNewColumns(): Promise<void>; /** * Updates composite primary keys. */ protected updatePrimaryKeys(): Promise<void>; /** * Update all exist columns which metadata has changed. * Still don't create keys. Also we don't touch foreign keys of the changed columns. */ protected updateExistColumns(): Promise<void>; /** * Creates composite indices which are missing in db yet. */ protected createNewIndices(): Promise<void>; /** * Creates indices for materialized views. */ protected createNewViewIndices(): Promise<void>; protected createNewChecks(): Promise<void>; /** * Creates composite uniques which are missing in db yet. */ protected createCompositeUniqueConstraints(): Promise<void>; /** * Creates exclusions which are missing in db yet. */ protected createNewExclusions(): Promise<void>; /** * Creates foreign keys which does not exist in the table yet. */ protected createForeignKeys(): Promise<void>; /** * Drops all foreign keys where given column of the given table is being used. * * @param tablePath * @param columnName */ protected dropColumnReferencedForeignKeys(tablePath: string, columnName: string): Promise<void>; /** * Drops all composite indices, related to given column. * * @param tablePath * @param columnName */ protected dropColumnCompositeIndices(tablePath: string, columnName: string): Promise<void>; /** * Drops all composite uniques, related to given column. * * @param tablePath * @param columnName */ protected dropColumnCompositeUniques(tablePath: string, columnName: string): Promise<void>; /** * Creates new columns from the given column metadatas. * * @param columns */ protected metadataColumnsToTableColumnOptions(columns: ColumnMetadata[]): TableColumnOptions[]; /** * Creates typeorm service table for storing user defined Views and generate columns. * * @param queryRunner */ protected createTypeormMetadataTable(queryRunner: QueryRunner): Promise<void>; }