@mikro-orm/sql 7.1.0-dev.25 → 7.1.0-dev.27
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/AbstractSqlDriver.js +3 -1
- package/SqlMikroORM.d.ts +23 -0
- package/SqlMikroORM.js +23 -0
- package/dialects/mysql/MySqlSchemaHelper.d.ts +4 -0
- package/dialects/mysql/MySqlSchemaHelper.js +18 -0
- package/dialects/postgresql/PostgreSqlSchemaHelper.d.ts +3 -0
- package/dialects/postgresql/PostgreSqlSchemaHelper.js +11 -0
- package/dialects/sqlite/SqliteSchemaHelper.d.ts +1 -0
- package/dialects/sqlite/SqliteSchemaHelper.js +4 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/package.json +2 -2
- package/schema/SchemaHelper.d.ts +10 -0
- package/schema/SchemaHelper.js +33 -0
- package/schema/SqlSchemaGenerator.d.ts +2 -2
- package/schema/SqlSchemaGenerator.js +9 -9
package/AbstractSqlDriver.js
CHANGED
|
@@ -57,7 +57,9 @@ export class AbstractSqlDriver extends DatabaseDriver {
|
|
|
57
57
|
const populate = this.autoJoinOneToOneOwner(meta, options.populate, options.fields);
|
|
58
58
|
const joinedProps = this.joinedProps(meta, populate, options);
|
|
59
59
|
const schema = this.getSchemaName(meta, options);
|
|
60
|
-
const qb = this.createQueryBuilder(meta.class, options.ctx, connectionType, false, options.logging, undefined, options.em)
|
|
60
|
+
const qb = this.createQueryBuilder(meta.class, options.ctx, connectionType, false, options.logging, undefined, options.em)
|
|
61
|
+
.withSchema(schema)
|
|
62
|
+
.cache(false);
|
|
61
63
|
const fields = this.buildFields(meta, populate, joinedProps, qb, qb.alias, options, schema);
|
|
62
64
|
const orderBy = this.buildOrderBy(qb, meta, populate, options);
|
|
63
65
|
const populateWhere = this.buildPopulateWhere(meta, joinedProps, options);
|
package/SqlMikroORM.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AnyEntity, type EntityClass, type EntityManager, type EntityManagerType, type EntitySchema, type IDatabaseDriver, MikroORM, type Options } from '@mikro-orm/core';
|
|
2
|
+
import type { AbstractSqlDriver } from './AbstractSqlDriver.js';
|
|
3
|
+
import type { SqlEntityManager } from './SqlEntityManager.js';
|
|
4
|
+
/** Configuration options shared by all SQL drivers. */
|
|
5
|
+
export type SqlOptions<D extends AbstractSqlDriver = AbstractSqlDriver, EM extends SqlEntityManager<D> = SqlEntityManager<D>, Entities extends readonly (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]> = Partial<Options<D, EM, Entities>>;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a type-safe configuration object for any SQL driver. The driver class
|
|
8
|
+
* must be passed via `options.driver` (e.g. `SqliteDriver`, `MySqlDriver`, …).
|
|
9
|
+
*/
|
|
10
|
+
export declare function defineSqlConfig<D extends AbstractSqlDriver = AbstractSqlDriver, EM extends SqlEntityManager<D> = SqlEntityManager<D>, Entities extends readonly (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]>(options: Partial<Options<D, EM, Entities>>): Partial<Options<D, EM, Entities>>;
|
|
11
|
+
/**
|
|
12
|
+
* Generic entry point for SQL drivers. Use this when consuming `@mikro-orm/sql`
|
|
13
|
+
* directly with a Kysely dialect; for the bundled driver packages prefer
|
|
14
|
+
* `@mikro-orm/sqlite`, `@mikro-orm/postgresql`, etc.
|
|
15
|
+
*
|
|
16
|
+
* @inheritDoc
|
|
17
|
+
*/
|
|
18
|
+
export declare class SqlMikroORM<D extends AbstractSqlDriver = AbstractSqlDriver, EM extends SqlEntityManager<D> = SqlEntityManager<D>, Entities extends readonly (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]> extends MikroORM<D, EM, Entities> {
|
|
19
|
+
/**
|
|
20
|
+
* @inheritDoc
|
|
21
|
+
*/
|
|
22
|
+
static init<D extends IDatabaseDriver = AbstractSqlDriver, EM extends EntityManager<D> = D[typeof EntityManagerType] & EntityManager<D>, Entities extends readonly (string | EntityClass<AnyEntity> | EntitySchema)[] = (string | EntityClass<AnyEntity> | EntitySchema)[]>(options: Partial<Options<D, EM, Entities>>): Promise<MikroORM<D, EM, Entities>>;
|
|
23
|
+
}
|
package/SqlMikroORM.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineConfig, MikroORM, } from '@mikro-orm/core';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a type-safe configuration object for any SQL driver. The driver class
|
|
4
|
+
* must be passed via `options.driver` (e.g. `SqliteDriver`, `MySqlDriver`, …).
|
|
5
|
+
*/
|
|
6
|
+
export function defineSqlConfig(options) {
|
|
7
|
+
return defineConfig(options);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Generic entry point for SQL drivers. Use this when consuming `@mikro-orm/sql`
|
|
11
|
+
* directly with a Kysely dialect; for the bundled driver packages prefer
|
|
12
|
+
* `@mikro-orm/sqlite`, `@mikro-orm/postgresql`, etc.
|
|
13
|
+
*
|
|
14
|
+
* @inheritDoc
|
|
15
|
+
*/
|
|
16
|
+
export class SqlMikroORM extends MikroORM {
|
|
17
|
+
/**
|
|
18
|
+
* @inheritDoc
|
|
19
|
+
*/
|
|
20
|
+
static async init(options) {
|
|
21
|
+
return super.init(options);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -13,6 +13,10 @@ export declare class MySqlSchemaHelper extends SchemaHelper {
|
|
|
13
13
|
};
|
|
14
14
|
private static readonly PARTIAL_INDEX_RE;
|
|
15
15
|
getSchemaBeginning(charset: string, disableForeignKeys?: boolean): string;
|
|
16
|
+
getSetSchemaSQL(schema: string): string;
|
|
17
|
+
getResetSchemaSQL(defaultSchema: string): string;
|
|
18
|
+
supportsMigrationSchema(): boolean;
|
|
19
|
+
tableExists(connection: AbstractSqlConnection, tableName: string, schemaName: string | undefined, ctx?: Transaction): Promise<boolean>;
|
|
16
20
|
disableForeignKeysSQL(): string;
|
|
17
21
|
enableForeignKeysSQL(): string;
|
|
18
22
|
finalizeTable(table: DatabaseTable, charset: string, collate?: string): string;
|
|
@@ -17,6 +17,24 @@ export class MySqlSchemaHelper extends SchemaHelper {
|
|
|
17
17
|
}
|
|
18
18
|
return `set names ${charset};\n\n`;
|
|
19
19
|
}
|
|
20
|
+
getSetSchemaSQL(schema) {
|
|
21
|
+
return `use ${this.quote(schema)}`;
|
|
22
|
+
}
|
|
23
|
+
getResetSchemaSQL(defaultSchema) {
|
|
24
|
+
return `use ${this.quote(defaultSchema)}`;
|
|
25
|
+
}
|
|
26
|
+
supportsMigrationSchema() {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
async tableExists(connection, tableName, schemaName, ctx) {
|
|
30
|
+
// MySQL "schema" = database — when none is requested, probe the connection's current DB
|
|
31
|
+
// via `schema()` rather than the base impl's `getDefaultSchemaName()` (which is undefined here).
|
|
32
|
+
const schemaClause = schemaName
|
|
33
|
+
? `table_schema = ${this.platform.quoteValue(schemaName)}`
|
|
34
|
+
: `table_schema = schema()`;
|
|
35
|
+
const rows = await connection.execute(`select 1 from information_schema.tables where ${schemaClause} and table_name = ${this.platform.quoteValue(tableName)}`, [], 'all', ctx);
|
|
36
|
+
return rows.length > 0;
|
|
37
|
+
}
|
|
20
38
|
disableForeignKeysSQL() {
|
|
21
39
|
return 'set foreign_key_checks = 0;';
|
|
22
40
|
}
|
|
@@ -17,6 +17,9 @@ export declare class PostgreSqlSchemaHelper extends SchemaHelper {
|
|
|
17
17
|
private static readonly PARTIAL_WHERE_RE;
|
|
18
18
|
private static readonly FUNCTIONAL_COL_RE;
|
|
19
19
|
getSchemaBeginning(charset: string, disableForeignKeys?: boolean): string;
|
|
20
|
+
getSetSchemaSQL(schema: string): string;
|
|
21
|
+
getResetSchemaSQL(_defaultSchema: string): string;
|
|
22
|
+
supportsMigrationSchema(): boolean;
|
|
20
23
|
getCreateDatabaseSQL(name: string): string;
|
|
21
24
|
getListTablesSQL(): string;
|
|
22
25
|
private getIgnoredViewsCondition;
|
|
@@ -21,6 +21,17 @@ export class PostgreSqlSchemaHelper extends SchemaHelper {
|
|
|
21
21
|
}
|
|
22
22
|
return `set names '${charset}';\n\n`;
|
|
23
23
|
}
|
|
24
|
+
getSetSchemaSQL(schema) {
|
|
25
|
+
// session-level `SET` (not `SET LOCAL`) so it also works outside a transaction; the runner
|
|
26
|
+
// emits `getResetSchemaSQL` afterwards to avoid leaking onto the pooled connection
|
|
27
|
+
return `set search_path to ${this.quote(schema)}`;
|
|
28
|
+
}
|
|
29
|
+
getResetSchemaSQL(_defaultSchema) {
|
|
30
|
+
return 'reset search_path';
|
|
31
|
+
}
|
|
32
|
+
supportsMigrationSchema() {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
24
35
|
getCreateDatabaseSQL(name) {
|
|
25
36
|
return `create database ${this.quote(name)}`;
|
|
26
37
|
}
|
|
@@ -11,6 +11,7 @@ export declare class SqliteSchemaHelper extends SchemaHelper {
|
|
|
11
11
|
supportsSchemaConstraints(): boolean;
|
|
12
12
|
getCreateNamespaceSQL(name: string): string;
|
|
13
13
|
getDropNamespaceSQL(name: string): string;
|
|
14
|
+
tableExists(connection: AbstractSqlConnection, tableName: string, _schemaName: string | undefined, ctx?: Transaction): Promise<boolean>;
|
|
14
15
|
getListTablesSQL(): string;
|
|
15
16
|
getAllTables(connection: AbstractSqlConnection, schemas?: string[], ctx?: Transaction): Promise<Table[]>;
|
|
16
17
|
getNamespaces(connection: AbstractSqlConnection, ctx?: Transaction): Promise<string[]>;
|
|
@@ -31,6 +31,10 @@ export class SqliteSchemaHelper extends SchemaHelper {
|
|
|
31
31
|
getDropNamespaceSQL(name) {
|
|
32
32
|
return '';
|
|
33
33
|
}
|
|
34
|
+
async tableExists(connection, tableName, _schemaName, ctx) {
|
|
35
|
+
const rows = await connection.execute(`select name from sqlite_master where type = 'table' and name = ${this.platform.quoteValue(tableName)}`, [], 'all', ctx);
|
|
36
|
+
return rows.length > 0;
|
|
37
|
+
}
|
|
34
38
|
getListTablesSQL() {
|
|
35
39
|
return (`select name as table_name from sqlite_master where type = 'table' and name != 'sqlite_sequence' and name != 'geometry_columns' and name != 'spatial_ref_sys' ` +
|
|
36
40
|
`union all select name as table_name from sqlite_temp_master where type = 'table' order by name`);
|
package/index.d.ts
CHANGED
|
@@ -17,3 +17,5 @@ export type * from './typings.js';
|
|
|
17
17
|
export * from './plugin/index.js';
|
|
18
18
|
export { SqlEntityManager as EntityManager } from './SqlEntityManager.js';
|
|
19
19
|
export { SqlEntityRepository as EntityRepository } from './SqlEntityRepository.js';
|
|
20
|
+
export * from './SqlMikroORM.js';
|
|
21
|
+
export { SqlMikroORM as MikroORM, type SqlOptions as Options, defineSqlConfig as defineConfig } from './SqlMikroORM.js';
|
package/index.js
CHANGED
|
@@ -16,3 +16,5 @@ export * from './dialects/index.js';
|
|
|
16
16
|
export * from './plugin/index.js';
|
|
17
17
|
export { SqlEntityManager as EntityManager } from './SqlEntityManager.js';
|
|
18
18
|
export { SqlEntityRepository as EntityRepository } from './SqlEntityRepository.js';
|
|
19
|
+
export * from './SqlMikroORM.js';
|
|
20
|
+
export { SqlMikroORM as MikroORM, defineSqlConfig as defineConfig } from './SqlMikroORM.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikro-orm/sql",
|
|
3
|
-
"version": "7.1.0-dev.
|
|
3
|
+
"version": "7.1.0-dev.27",
|
|
4
4
|
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"data-mapper",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@mikro-orm/core": "^7.0.13"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@mikro-orm/core": "7.1.0-dev.
|
|
56
|
+
"@mikro-orm/core": "7.1.0-dev.27"
|
|
57
57
|
},
|
|
58
58
|
"engines": {
|
|
59
59
|
"node": ">= 22.17.0"
|
package/schema/SchemaHelper.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ export declare abstract class SchemaHelper {
|
|
|
16
16
|
enableForeignKeysSQL(): string;
|
|
17
17
|
/** Returns SQL to append to schema migration scripts (e.g., re-enabling FK checks). */
|
|
18
18
|
getSchemaEnd(disableForeignKeys?: boolean): string;
|
|
19
|
+
/** Sets the current schema for the session (e.g. `SET search_path`). */
|
|
20
|
+
getSetSchemaSQL(_schema: string): string;
|
|
21
|
+
/** Whether the driver supports setting a runtime schema per migration run. */
|
|
22
|
+
supportsMigrationSchema(): boolean;
|
|
23
|
+
/** Restores the session's schema to the connection's default after a migration. */
|
|
24
|
+
getResetSchemaSQL(_defaultSchema: string): string;
|
|
25
|
+
/** Returns `undefined` for schemaless drivers, throws for drivers that have schemas but no session switch. */
|
|
26
|
+
resolveMigrationSchema(schema: string | undefined): string | undefined;
|
|
19
27
|
finalizeTable(table: DatabaseTable, charset: string, collate?: string): string;
|
|
20
28
|
appendComments(table: DatabaseTable): string[];
|
|
21
29
|
supportsSchemaConstraints(): boolean;
|
|
@@ -31,6 +39,8 @@ export declare abstract class SchemaHelper {
|
|
|
31
39
|
getListTablesSQL(): string;
|
|
32
40
|
/** Retrieves all tables from the database. */
|
|
33
41
|
getAllTables(connection: AbstractSqlConnection, schemas?: string[], ctx?: Transaction): Promise<Table[]>;
|
|
42
|
+
/** Checks whether a specific table exists in a given schema (not the connection's current schema). */
|
|
43
|
+
tableExists(connection: AbstractSqlConnection, tableName: string, schemaName: string | undefined, ctx?: Transaction): Promise<boolean>;
|
|
34
44
|
getListViewsSQL(): string;
|
|
35
45
|
loadViews(schema: DatabaseSchema, connection: AbstractSqlConnection, schemaName?: string, ctx?: Transaction): Promise<void>;
|
|
36
46
|
/** Returns SQL to rename a column in a table. */
|
package/schema/SchemaHelper.js
CHANGED
|
@@ -27,6 +27,32 @@ export class SchemaHelper {
|
|
|
27
27
|
}
|
|
28
28
|
return '';
|
|
29
29
|
}
|
|
30
|
+
/** Sets the current schema for the session (e.g. `SET search_path`). */
|
|
31
|
+
getSetSchemaSQL(_schema) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
/** Whether the driver supports setting a runtime schema per migration run. */
|
|
35
|
+
supportsMigrationSchema() {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
/** Restores the session's schema to the connection's default after a migration. */
|
|
39
|
+
getResetSchemaSQL(_defaultSchema) {
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
/** Returns `undefined` for schemaless drivers, throws for drivers that have schemas but no session switch. */
|
|
43
|
+
resolveMigrationSchema(schema) {
|
|
44
|
+
if (!schema) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
if (this.supportsMigrationSchema()) {
|
|
48
|
+
return schema;
|
|
49
|
+
}
|
|
50
|
+
if (!this.platform.supportsSchemas()) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const driverName = this.platform.constructor.name.replace(/Platform$/, 'Driver');
|
|
54
|
+
throw new Error(`Runtime schema for migrations is not supported by the ${driverName}`);
|
|
55
|
+
}
|
|
30
56
|
finalizeTable(table, charset, collate) {
|
|
31
57
|
return '';
|
|
32
58
|
}
|
|
@@ -75,6 +101,13 @@ export class SchemaHelper {
|
|
|
75
101
|
async getAllTables(connection, schemas, ctx) {
|
|
76
102
|
return connection.execute(this.getListTablesSQL(), [], 'all', ctx);
|
|
77
103
|
}
|
|
104
|
+
/** Checks whether a specific table exists in a given schema (not the connection's current schema). */
|
|
105
|
+
async tableExists(connection, tableName, schemaName, ctx) {
|
|
106
|
+
const qv = (v) => this.platform.quoteValue(v ?? '');
|
|
107
|
+
const resolved = schemaName ?? this.platform.getDefaultSchemaName();
|
|
108
|
+
const rows = await connection.execute(`select 1 from information_schema.tables where table_schema = ${qv(resolved)} and table_name = ${qv(tableName)}`, [], 'all', ctx);
|
|
109
|
+
return rows.length > 0;
|
|
110
|
+
}
|
|
78
111
|
getListViewsSQL() {
|
|
79
112
|
throw new Error('Not supported by given driver');
|
|
80
113
|
}
|
|
@@ -15,8 +15,8 @@ export declare class SqlSchemaGenerator extends AbstractSchemaGenerator<Abstract
|
|
|
15
15
|
* Returns true if the database was created.
|
|
16
16
|
*/
|
|
17
17
|
ensureDatabase(options?: EnsureDatabaseOptions): Promise<boolean>;
|
|
18
|
-
getTargetSchema(schema?: string): DatabaseSchema;
|
|
19
|
-
protected getOrderedMetadata(schema?: string): EntityMetadata[];
|
|
18
|
+
getTargetSchema(schema?: string, includeWildcardSchema?: boolean): DatabaseSchema;
|
|
19
|
+
protected getOrderedMetadata(schema?: string, includeWildcardSchema?: boolean): EntityMetadata[];
|
|
20
20
|
getCreateSchemaSQL(options?: CreateSchemaOptions): Promise<string>;
|
|
21
21
|
drop(options?: DropSchemaOptions): Promise<void>;
|
|
22
22
|
createNamespace(name: string): Promise<void>;
|
|
@@ -44,13 +44,13 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
44
44
|
}
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
47
|
-
getTargetSchema(schema) {
|
|
48
|
-
const metadata = this.getOrderedMetadata(schema);
|
|
47
|
+
getTargetSchema(schema, includeWildcardSchema = false) {
|
|
48
|
+
const metadata = this.getOrderedMetadata(schema, includeWildcardSchema);
|
|
49
49
|
const schemaName = schema ?? this.config.get('schema') ?? this.platform.getDefaultSchemaName();
|
|
50
50
|
return DatabaseSchema.fromMetadata(metadata, this.platform, this.config, schemaName, this.em);
|
|
51
51
|
}
|
|
52
|
-
getOrderedMetadata(schema) {
|
|
53
|
-
const metadata = super.getOrderedMetadata(schema);
|
|
52
|
+
getOrderedMetadata(schema, includeWildcardSchema = false) {
|
|
53
|
+
const metadata = super.getOrderedMetadata(schema, includeWildcardSchema);
|
|
54
54
|
// Filter out skipped tables
|
|
55
55
|
return metadata.filter(meta => {
|
|
56
56
|
const tableName = meta.tableName;
|
|
@@ -59,7 +59,7 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
async getCreateSchemaSQL(options = {}) {
|
|
62
|
-
const toSchema = this.getTargetSchema(options.schema);
|
|
62
|
+
const toSchema = this.getTargetSchema(options.schema, options.includeWildcardSchema);
|
|
63
63
|
const ret = [];
|
|
64
64
|
for (const namespace of toSchema.getNamespaces()) {
|
|
65
65
|
if (namespace === this.platform.getDefaultSchemaName()) {
|
|
@@ -225,13 +225,13 @@ export class SqlSchemaGenerator extends AbstractSchemaGenerator {
|
|
|
225
225
|
async prepareSchemaForComparison(options) {
|
|
226
226
|
options.safe ??= false;
|
|
227
227
|
options.dropTables ??= true;
|
|
228
|
-
const toSchema = this.getTargetSchema(options.schema);
|
|
228
|
+
const toSchema = this.getTargetSchema(options.schema, options.includeWildcardSchema);
|
|
229
229
|
const schemas = toSchema.getNamespaces();
|
|
230
230
|
const fromSchema = options.fromSchema ??
|
|
231
231
|
(await DatabaseSchema.create(this.connection, this.platform, this.config, options.schema, schemas, undefined, this.options.skipTables, this.options.skipViews));
|
|
232
|
-
const wildcardSchemaTables =
|
|
233
|
-
|
|
234
|
-
.map(meta => meta.tableName);
|
|
232
|
+
const wildcardSchemaTables = options.includeWildcardSchema
|
|
233
|
+
? []
|
|
234
|
+
: [...this.metadata.getAll().values()].filter(meta => meta.schema === '*').map(meta => meta.tableName);
|
|
235
235
|
fromSchema.prune(options.schema, wildcardSchemaTables);
|
|
236
236
|
toSchema.prune(options.schema, wildcardSchemaTables);
|
|
237
237
|
return { fromSchema, toSchema };
|