@mikro-orm/sql 7.1.0-dev.11 → 7.1.0-dev.12

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.
@@ -60,7 +60,7 @@ export declare abstract class AbstractSqlConnection extends Connection {
60
60
  /** Executes a SQL query and returns the result based on the method: `'all'` for rows, `'get'` for single row, `'run'` for affected count. */
61
61
  execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(query: string | NativeQueryBuilder | RawQueryFragment, params?: readonly unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction, loggerContext?: LoggingOptions): Promise<T>;
62
62
  /** Executes a SQL query and returns an async iterable that yields results row by row. */
63
- stream<T extends EntityData<AnyEntity>>(query: string | NativeQueryBuilder | RawQueryFragment, params?: readonly unknown[], ctx?: Transaction<Kysely<any>>, loggerContext?: LoggingOptions): AsyncIterableIterator<T>;
63
+ stream<T extends EntityData<AnyEntity>>(query: string | NativeQueryBuilder | RawQueryFragment, params?: readonly unknown[], ctx?: Transaction<Kysely<any>>, loggerContext?: LoggingOptions, chunkSize?: number): AsyncIterableIterator<T>;
64
64
  /** @inheritDoc */
65
65
  executeDump(dump: string): Promise<void>;
66
66
  protected getSql(query: string, formatted: string, context?: LogContext): string;
@@ -190,7 +190,7 @@ export class AbstractSqlConnection extends Connection {
190
190
  }, { ...q, ...loggerContext });
191
191
  }
192
192
  /** Executes a SQL query and returns an async iterable that yields results row by row. */
193
- async *stream(query, params = [], ctx, loggerContext) {
193
+ async *stream(query, params = [], ctx, loggerContext, chunkSize) {
194
194
  await this.ensureConnection();
195
195
  const q = this.prepareQuery(query, params);
196
196
  const sql = this.getSql(q.query, q.formatted, loggerContext);
@@ -203,7 +203,7 @@ export class AbstractSqlConnection extends Connection {
203
203
  parameters: [],
204
204
  };
205
205
  try {
206
- const res = (ctx ?? this.getClient()).getExecutor().stream(compiled, 1);
206
+ const res = (ctx ?? this.getClient()).getExecutor().stream(compiled, chunkSize ?? 100);
207
207
  this.logQuery(sql, {
208
208
  sql,
209
209
  params,
@@ -31,7 +31,7 @@ export declare abstract class AbstractSqlDriver<Connection extends AbstractSqlCo
31
31
  protected findFromVirtual<T extends object>(entityName: EntityName<T>, where: ObjectQuery<T>, options: FindOptions<T, any> | CountOptions<T, any>, type: QueryType): Promise<EntityData<T>[] | number>;
32
32
  protected streamFromVirtual<T extends object>(entityName: EntityName<T>, where: FilterQuery<T>, options: StreamOptions<T, any>): AsyncIterableIterator<EntityData<T>>;
33
33
  protected wrapVirtualExpressionInSubquery<T extends object>(meta: EntityMetadata<T>, expression: string, where: FilterQuery<T>, options: FindOptions<T, any>, type: QueryType): Promise<T[] | number>;
34
- protected wrapVirtualExpressionInSubqueryStream<T extends object>(meta: EntityMetadata<T>, expression: string, where: FilterQuery<T>, options: FindOptions<T, any, any, any>, type: QueryType.SELECT): AsyncIterableIterator<T>;
34
+ protected wrapVirtualExpressionInSubqueryStream<T extends object>(meta: EntityMetadata<T>, expression: string, where: FilterQuery<T>, options: StreamOptions<T, any, any, any>, type: QueryType.SELECT): AsyncIterableIterator<T>;
35
35
  /**
36
36
  * Virtual entities have no PKs, so to-many populate joins can't be deduplicated.
37
37
  * Force balanced strategy to load to-many relations via separate queries.
@@ -231,7 +231,7 @@ export class AbstractSqlDriver extends DatabaseDriver {
231
231
  native.from(raw(`(${expression})${asKeyword}${this.platform.quoteIdentifier(qb.alias)}`));
232
232
  const query = native.compile();
233
233
  const connectionType = this.resolveConnectionType({ ctx: options.ctx, connectionType: options.connectionType });
234
- const res = this.getConnection(connectionType).stream(query.sql, query.params, options.ctx, options.loggerContext);
234
+ const res = this.getConnection(connectionType).stream(query.sql, query.params, options.ctx, options.loggerContext, options.chunkSize);
235
235
  for await (const row of res) {
236
236
  yield this.mapResult(row, meta);
237
237
  }
@@ -46,7 +46,7 @@ declare class OracleConnection implements DatabaseConnection {
46
46
  sql: string;
47
47
  bindParams: unknown[];
48
48
  };
49
- streamQuery<R>(compiledQuery: CompiledQuery, _chunkSize?: number): AsyncIterableIterator<QueryResult<R>>;
49
+ streamQuery<R>(compiledQuery: CompiledQuery, chunkSize?: number): AsyncIterableIterator<QueryResult<R>>;
50
50
  get connection(): OraclePoolConnection;
51
51
  }
52
52
  declare class OracleDriver implements Driver {
@@ -66,13 +66,14 @@ class OracleConnection {
66
66
  bindParams: query.parameters,
67
67
  };
68
68
  }
69
- async *streamQuery(compiledQuery, _chunkSize) {
69
+ async *streamQuery(compiledQuery, chunkSize) {
70
70
  const { sql, bindParams } = this.formatQuery(compiledQuery);
71
71
  const result = await this.#connection.execute(sql, bindParams, {
72
72
  resultSet: true,
73
73
  autoCommit: compiledQuery.autoCommit,
74
74
  outFormat: OUT_FORMAT_OBJECT,
75
75
  ...this.#executeOptions,
76
+ ...(chunkSize != null ? { fetchArraySize: chunkSize } : {}),
76
77
  });
77
78
  const rs = result.resultSet;
78
79
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikro-orm/sql",
3
- "version": "7.1.0-dev.11",
3
+ "version": "7.1.0-dev.12",
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.11"
54
54
  },
55
55
  "peerDependencies": {
56
- "@mikro-orm/core": "7.1.0-dev.11"
56
+ "@mikro-orm/core": "7.1.0-dev.12"
57
57
  },
58
58
  "engines": {
59
59
  "node": ">= 22.17.0"
@@ -11,6 +11,20 @@ export interface ExecuteOptions {
11
11
  mergeResults?: boolean;
12
12
  }
13
13
  export interface QBStreamOptions {
14
+ /**
15
+ * How many rows to fetch in one round-trip.
16
+ * Lower values will result in more queries and network bandwidth, but less memory usage.
17
+ * Higher values will result in fewer queries and network bandwidth, but higher memory usage.
18
+ * Note that the results are iterated one row at a time regardless of this value.
19
+ *
20
+ * Honored on PostgreSQL (cursor-based fetch), MSSQL (tedious stream chunk size)
21
+ * and Oracle (mapped to `fetchArraySize`). Ignored on MySQL, MariaDB, SQLite and
22
+ * libSQL, where the underlying driver already streams row-by-row with no batching
23
+ * knob.
24
+ *
25
+ * @default 100 on dialects that honor it.
26
+ */
27
+ chunkSize?: number;
14
28
  /**
15
29
  * Results are mapped to entities, if you set `mapResults: false` you will get POJOs instead.
16
30
  *
@@ -1064,9 +1064,10 @@ export class QueryBuilder {
1064
1064
  options ??= {};
1065
1065
  options.mergeResults ??= true;
1066
1066
  options.mapResults ??= true;
1067
+ const chunkSize = options.chunkSize ?? 100;
1067
1068
  const query = this.toQuery();
1068
1069
  const loggerContext = { id: this.em?.id, ...this.loggerContext };
1069
- const res = this.getConnection().stream(query.sql, query.params, this.context, loggerContext);
1070
+ const res = this.getConnection().stream(query.sql, query.params, this.context, loggerContext, chunkSize);
1070
1071
  const meta = this.mainAlias.meta;
1071
1072
  if (options.rawResults || !meta) {
1072
1073
  yield* res;