@simplysm/orm-node 13.0.69 → 13.0.71
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 +20 -476
- package/dist/connections/mssql-db-conn.d.ts +5 -5
- package/dist/connections/mssql-db-conn.js +12 -12
- package/dist/connections/mssql-db-conn.js.map +1 -1
- package/dist/connections/mysql-db-conn.d.ts +3 -3
- package/dist/connections/mysql-db-conn.js +9 -9
- package/dist/connections/mysql-db-conn.js.map +1 -1
- package/dist/connections/postgresql-db-conn.d.ts +3 -3
- package/dist/connections/postgresql-db-conn.js +6 -6
- package/dist/connections/postgresql-db-conn.js.map +1 -1
- package/dist/create-db-conn.d.ts +5 -5
- package/dist/create-db-conn.js +1 -1
- package/dist/create-orm.d.ts +18 -18
- package/dist/node-db-context-executor.d.ts +30 -30
- package/dist/node-db-context-executor.js +28 -28
- package/dist/pooled-db-conn.d.ts +27 -27
- package/dist/pooled-db-conn.js +29 -29
- package/dist/pooled-db-conn.js.map +1 -1
- package/dist/types/db-conn.d.ts +47 -47
- package/dist/types/db-conn.d.ts.map +1 -1
- package/dist/types/db-conn.js +2 -2
- package/package.json +5 -5
- package/src/connections/mssql-db-conn.ts +18 -18
- package/src/connections/mysql-db-conn.ts +25 -25
- package/src/connections/postgresql-db-conn.ts +14 -14
- package/src/create-db-conn.ts +17 -17
- package/src/create-orm.ts +20 -20
- package/src/node-db-context-executor.ts +34 -34
- package/src/pooled-db-conn.ts +42 -42
- package/src/types/db-conn.ts +48 -48
package/README.md
CHANGED
|
@@ -1,493 +1,37 @@
|
|
|
1
1
|
# @simplysm/orm-node
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Simplysm package - ORM module (node)
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
```bash
|
|
8
|
-
npm install @simplysm/orm-node
|
|
9
|
-
# or
|
|
10
7
|
pnpm add @simplysm/orm-node
|
|
11
|
-
```
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
**Peer Dependencies:** `mysql2` (optional), `pg` (optional), `pg-copy-streams` (optional), `tedious` (optional)
|
|
14
10
|
|
|
15
|
-
|
|
11
|
+
## Source Index
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
# MySQL
|
|
19
|
-
npm install mysql2
|
|
13
|
+
### Types
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
| Source | Exports | Description | Test |
|
|
16
|
+
|--------|---------|-------------|------|
|
|
17
|
+
| `src/types/db-conn.ts` | `DB_CONN_CONNECT_TIMEOUT`, `DB_CONN_DEFAULT_TIMEOUT`, `DB_CONN_ERRORS`, `DbConn`, `DbPoolConfig`, `DbConnConfig`, `MysqlDbConnConfig`, `MssqlDbConnConfig`, `PostgresqlDbConnConfig`, `getDialectFromConfig` | Database connection interface, config types, and timeout constants for all dialects | `-` |
|
|
23
18
|
|
|
24
|
-
|
|
25
|
-
npm install pg pg-copy-streams
|
|
26
|
-
```
|
|
19
|
+
### Connections
|
|
27
20
|
|
|
28
|
-
|
|
21
|
+
| Source | Exports | Description | Test |
|
|
22
|
+
|--------|---------|-------------|------|
|
|
23
|
+
| `src/connections/mssql-db-conn.ts` | `MssqlDbConn` | MSSQL database connection implementation using tedious | `-` |
|
|
24
|
+
| `src/connections/mysql-db-conn.ts` | `MysqlDbConn` | MySQL database connection implementation using mysql2 | `-` |
|
|
25
|
+
| `src/connections/postgresql-db-conn.ts` | `PostgresqlDbConn` | PostgreSQL database connection implementation using pg | `-` |
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
createOrm() (top-level entry point)
|
|
32
|
-
└── NodeDbContextExecutor (executor between DbContext and actual DB)
|
|
33
|
-
└── createDbConn() (connection creation and pool management)
|
|
34
|
-
└── PooledDbConn (connection pool wrapper)
|
|
35
|
-
└── MysqlDbConn / MssqlDbConn / PostgresqlDbConn (DBMS-specific low-level connections)
|
|
36
|
-
```
|
|
27
|
+
### Core
|
|
37
28
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- `createDbConn
|
|
41
|
-
- `
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
## Main Modules
|
|
45
|
-
|
|
46
|
-
### Functions
|
|
47
|
-
|
|
48
|
-
| Function | Description |
|
|
49
|
-
|----------|-------------|
|
|
50
|
-
| `createOrm()` | ORM factory function. Takes a `DbContextDef` and connection settings to manage transaction-based connections. |
|
|
51
|
-
| `createDbConn()` | Connection factory function. Caches connection pools by configuration and returns a `DbConn` (backed by `PooledDbConn`). |
|
|
52
|
-
|
|
53
|
-
### Classes
|
|
54
|
-
|
|
55
|
-
| Class | Description |
|
|
56
|
-
|--------|------|
|
|
57
|
-
| `NodeDbContextExecutor` | `DbContextExecutor` implementation. Converts `QueryDef` to SQL, executes it, and parses results. |
|
|
58
|
-
| `PooledDbConn` | Connection pool wrapper. Acquires/returns physical connections from `generic-pool`, implements `DbConn` interface. |
|
|
59
|
-
| `MysqlDbConn` | MySQL connection class. Uses `mysql2/promise` driver. |
|
|
60
|
-
| `MssqlDbConn` | MSSQL/Azure SQL connection class. Uses `tedious` driver. |
|
|
61
|
-
| `PostgresqlDbConn` | PostgreSQL connection class. Uses `pg` and `pg-copy-streams` drivers. |
|
|
62
|
-
|
|
63
|
-
### Interfaces and Types
|
|
64
|
-
|
|
65
|
-
| Type | Description |
|
|
66
|
-
|------|------|
|
|
67
|
-
| `DbConn` | Low-level DB connection interface. Implemented by all DBMS-specific connection classes. |
|
|
68
|
-
| `Orm<TDef>` | Return type of `createOrm()`. Exposes `connect()` and `connectWithoutTransaction()` methods. |
|
|
69
|
-
| `OrmOptions` | `createOrm()` options. `database`, `schema` settings that override `DbConnConfig`. |
|
|
70
|
-
| `DbConnConfig` | DB connection config union type (`MysqlDbConnConfig \| MssqlDbConnConfig \| PostgresqlDbConnConfig`). |
|
|
71
|
-
| `MysqlDbConnConfig` | MySQL connection config. `dialect: "mysql"`. |
|
|
72
|
-
| `MssqlDbConnConfig` | MSSQL connection config. `dialect: "mssql" \| "mssql-azure"`. |
|
|
73
|
-
| `PostgresqlDbConnConfig` | PostgreSQL connection config. `dialect: "postgresql"`. |
|
|
74
|
-
| `DbPoolConfig` | Connection pool config (`min`, `max`, `acquireTimeoutMillis`, `idleTimeoutMillis`). |
|
|
75
|
-
|
|
76
|
-
### Constants and Utility Functions
|
|
77
|
-
|
|
78
|
-
| Name | Description |
|
|
79
|
-
|------|------|
|
|
80
|
-
| `DB_CONN_CONNECT_TIMEOUT` | DB connection establishment timeout (10 seconds, 10000ms). |
|
|
81
|
-
| `DB_CONN_DEFAULT_TIMEOUT` | DB query default timeout (10 minutes, 600000ms). |
|
|
82
|
-
| `DB_CONN_ERRORS` | DB connection error message constants (`NOT_CONNECTED`, `ALREADY_CONNECTED`). |
|
|
83
|
-
| `getDialectFromConfig(config)` | Extract `Dialect` from `DbConnConfig`. `"mssql-azure"` is converted to `"mssql"`. |
|
|
84
|
-
|
|
85
|
-
## Usage
|
|
86
|
-
|
|
87
|
-
### Basic Usage with createOrm
|
|
88
|
-
|
|
89
|
-
`createOrm()` is the top-level factory function used with `defineDbContext`. It automatically handles transaction management.
|
|
90
|
-
|
|
91
|
-
```typescript
|
|
92
|
-
import { createOrm } from "@simplysm/orm-node";
|
|
93
|
-
import { defineDbContext, Table } from "@simplysm/orm-common";
|
|
94
|
-
|
|
95
|
-
// 1. Define table
|
|
96
|
-
const User = Table("User")
|
|
97
|
-
.database("mydb")
|
|
98
|
-
.columns((c) => ({
|
|
99
|
-
id: c.bigint().autoIncrement(),
|
|
100
|
-
name: c.varchar(100),
|
|
101
|
-
email: c.varchar(200).nullable(),
|
|
102
|
-
}))
|
|
103
|
-
.primaryKey("id");
|
|
104
|
-
|
|
105
|
-
// 2. Define DbContext
|
|
106
|
-
const MyDb = defineDbContext({
|
|
107
|
-
tables: { user: User },
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
// 3. Create ORM instance
|
|
111
|
-
const orm = createOrm(MyDb, {
|
|
112
|
-
dialect: "mysql",
|
|
113
|
-
host: "localhost",
|
|
114
|
-
port: 3306,
|
|
115
|
-
username: "root",
|
|
116
|
-
password: "password",
|
|
117
|
-
database: "mydb",
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// 4. Execute queries within transaction (commits on success, rolls back on failure)
|
|
121
|
-
const users = await orm.connect(async (db) => {
|
|
122
|
-
return await db.user().result();
|
|
123
|
-
});
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### Transaction Management
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
// Execute within transaction (auto commit/rollback)
|
|
130
|
-
await orm.connect(async (db) => {
|
|
131
|
-
await db.user().insert([
|
|
132
|
-
{ name: "John Doe", email: "john@example.com" },
|
|
133
|
-
{ name: "Jane Smith", email: "jane@example.com" },
|
|
134
|
-
]);
|
|
135
|
-
// Commits if callback completes successfully
|
|
136
|
-
// Auto rollback if exception occurs
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
// Specify isolation level
|
|
140
|
-
await orm.connect(async (db) => {
|
|
141
|
-
const users = await db.user().result();
|
|
142
|
-
return users;
|
|
143
|
-
}, "SERIALIZABLE");
|
|
144
|
-
|
|
145
|
-
// Execute without transaction (for DDL operations, etc.)
|
|
146
|
-
await orm.connectWithoutTransaction(async (db) => {
|
|
147
|
-
const users = await db.user().result();
|
|
148
|
-
return users;
|
|
149
|
-
});
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Supported isolation levels (`IsolationLevel`):
|
|
153
|
-
- `"READ_UNCOMMITTED"`
|
|
154
|
-
- `"READ_COMMITTED"`
|
|
155
|
-
- `"REPEATABLE_READ"`
|
|
156
|
-
- `"SERIALIZABLE"`
|
|
157
|
-
|
|
158
|
-
### Overriding database/schema via OrmOptions
|
|
159
|
-
|
|
160
|
-
Using `OrmOptions`, you can use different values instead of the `database`/`schema` set in `DbConnConfig`.
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
const orm = createOrm(MyDb, {
|
|
164
|
-
dialect: "postgresql",
|
|
165
|
-
host: "localhost",
|
|
166
|
-
port: 5432,
|
|
167
|
-
username: "postgres",
|
|
168
|
-
password: "password",
|
|
169
|
-
database: "default_db", // Default DB used for connection
|
|
170
|
-
schema: "public",
|
|
171
|
-
}, {
|
|
172
|
-
database: "app_db", // DB to use in DbContext (takes precedence)
|
|
173
|
-
schema: "app_schema", // Schema to use in DbContext (takes precedence)
|
|
174
|
-
});
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Connection Pool Configuration
|
|
178
|
-
|
|
179
|
-
Configure connection pool via the `pool` field in `DbConnConfig`. The pool is based on the `generic-pool` library, and pools are automatically cached for identical configurations.
|
|
180
|
-
|
|
181
|
-
```typescript
|
|
182
|
-
const orm = createOrm(MyDb, {
|
|
183
|
-
dialect: "mssql",
|
|
184
|
-
host: "localhost",
|
|
185
|
-
port: 1433,
|
|
186
|
-
username: "sa",
|
|
187
|
-
password: "password",
|
|
188
|
-
database: "mydb",
|
|
189
|
-
pool: {
|
|
190
|
-
min: 2, // Minimum connections (default: 1)
|
|
191
|
-
max: 20, // Maximum connections (default: 10)
|
|
192
|
-
acquireTimeoutMillis: 60000, // Connection acquisition timeout (default: 30000ms)
|
|
193
|
-
idleTimeoutMillis: 60000, // Idle connection timeout (default: 30000ms)
|
|
194
|
-
},
|
|
195
|
-
});
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
### Low-Level Connection with createDbConn
|
|
199
|
-
|
|
200
|
-
You can connect directly to the DB and execute SQL without `createOrm`/`DbContext`. `createDbConn()` returns a `DbConn` (backed by `PooledDbConn`) from the connection pool.
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
import { createDbConn } from "@simplysm/orm-node";
|
|
204
|
-
|
|
205
|
-
// Create connection wrapper (pool acquisition happens on connect())
|
|
206
|
-
const conn = await createDbConn({
|
|
207
|
-
dialect: "mysql",
|
|
208
|
-
host: "localhost",
|
|
209
|
-
port: 3306,
|
|
210
|
-
username: "root",
|
|
211
|
-
password: "password",
|
|
212
|
-
database: "mydb",
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// Connect
|
|
216
|
-
await conn.connect();
|
|
217
|
-
|
|
218
|
-
try {
|
|
219
|
-
// Execute SQL
|
|
220
|
-
const results = await conn.execute(["SELECT * FROM User WHERE id = 1"]);
|
|
221
|
-
console.log(results); // [[{ id: 1, name: "John Doe", ... }]]
|
|
222
|
-
|
|
223
|
-
// Manual transaction management
|
|
224
|
-
await conn.beginTransaction("READ_COMMITTED");
|
|
225
|
-
await conn.execute(["INSERT INTO User (name) VALUES ('Jane Smith')"]);
|
|
226
|
-
await conn.commitTransaction();
|
|
227
|
-
} catch (err) {
|
|
228
|
-
if (conn.isInTransaction) {
|
|
229
|
-
await conn.rollbackTransaction();
|
|
230
|
-
}
|
|
231
|
-
throw err;
|
|
232
|
-
} finally {
|
|
233
|
-
// Return connection (returns to pool, not actual close)
|
|
234
|
-
await conn.close();
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
### Parameterized Query Execution
|
|
239
|
-
|
|
240
|
-
Each connection class supports parameter binding via the `executeParametrized()` method.
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
const conn = await createDbConn({
|
|
244
|
-
dialect: "postgresql",
|
|
245
|
-
host: "localhost",
|
|
246
|
-
port: 5432,
|
|
247
|
-
username: "postgres",
|
|
248
|
-
password: "password",
|
|
249
|
-
database: "mydb",
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
await conn.connect();
|
|
253
|
-
|
|
254
|
-
// Parameterized query (uses DBMS-specific placeholders like $1, $2)
|
|
255
|
-
const results = await conn.executeParametrized(
|
|
256
|
-
"SELECT * FROM \"User\" WHERE name = $1",
|
|
257
|
-
["John Doe"],
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
await conn.close();
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Bulk INSERT
|
|
264
|
-
|
|
265
|
-
Supports bulk data insertion using native bulk APIs for each DBMS.
|
|
266
|
-
|
|
267
|
-
| DBMS | Bulk Method |
|
|
268
|
-
|------|----------|
|
|
269
|
-
| MySQL | `LOAD DATA LOCAL INFILE` (temporary CSV file) |
|
|
270
|
-
| MSSQL | tedious `BulkLoad` API |
|
|
271
|
-
| PostgreSQL | `COPY FROM STDIN` (pg-copy-streams) |
|
|
272
|
-
|
|
273
|
-
```typescript
|
|
274
|
-
import type { ColumnMeta } from "@simplysm/orm-common";
|
|
275
|
-
|
|
276
|
-
const conn = await createDbConn({
|
|
277
|
-
dialect: "mysql",
|
|
278
|
-
host: "localhost",
|
|
279
|
-
port: 3306,
|
|
280
|
-
username: "root",
|
|
281
|
-
password: "password",
|
|
282
|
-
database: "mydb",
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
await conn.connect();
|
|
286
|
-
|
|
287
|
-
// Define column metadata
|
|
288
|
-
const columnMetas: Record<string, ColumnMeta> = {
|
|
289
|
-
name: { dataType: { type: "varchar", length: 100 } },
|
|
290
|
-
email: { dataType: { type: "varchar", length: 200 }, nullable: true },
|
|
291
|
-
age: { dataType: { type: "int" } },
|
|
292
|
-
};
|
|
293
|
-
|
|
294
|
-
// Insert bulk records
|
|
295
|
-
const records = [
|
|
296
|
-
{ name: "John Doe", email: "john@example.com", age: 30 },
|
|
297
|
-
{ name: "Jane Smith", email: "jane@example.com", age: 25 },
|
|
298
|
-
// ... thousands of records
|
|
299
|
-
];
|
|
300
|
-
|
|
301
|
-
await conn.bulkInsert("mydb.User", columnMetas, records);
|
|
302
|
-
await conn.close();
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### DBMS-Specific Connection Configuration
|
|
306
|
-
|
|
307
|
-
#### MySQL
|
|
308
|
-
|
|
309
|
-
```typescript
|
|
310
|
-
const mysqlConfig: MysqlDbConnConfig = {
|
|
311
|
-
dialect: "mysql",
|
|
312
|
-
host: "localhost",
|
|
313
|
-
port: 3306, // Optional (default: 3306)
|
|
314
|
-
username: "root",
|
|
315
|
-
password: "password",
|
|
316
|
-
database: "mydb", // Optional
|
|
317
|
-
defaultIsolationLevel: "READ_UNCOMMITTED", // Optional (default isolation level)
|
|
318
|
-
pool: { min: 1, max: 10 }, // Optional (connection pool)
|
|
319
|
-
};
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
MySQL connection characteristics:
|
|
323
|
-
- `multipleStatements: true` -- Can execute multiple SQL statements in one request
|
|
324
|
-
- `charset: "utf8mb4"` -- Supports 4-byte characters like emojis
|
|
325
|
-
- `LOAD DATA LOCAL INFILE` support (for bulk INSERT)
|
|
326
|
-
- `root` user can connect without binding to a specific database and access all DBs
|
|
327
|
-
|
|
328
|
-
#### MSSQL / Azure SQL
|
|
329
|
-
|
|
330
|
-
```typescript
|
|
331
|
-
const mssqlConfig: MssqlDbConnConfig = {
|
|
332
|
-
dialect: "mssql", // Or "mssql-azure" (for Azure SQL Database)
|
|
333
|
-
host: "localhost",
|
|
334
|
-
port: 1433, // Optional
|
|
335
|
-
username: "sa",
|
|
336
|
-
password: "password",
|
|
337
|
-
database: "mydb", // Optional
|
|
338
|
-
schema: "dbo", // Optional (MSSQL schema)
|
|
339
|
-
defaultIsolationLevel: "READ_UNCOMMITTED", // Optional
|
|
340
|
-
pool: { min: 1, max: 10 }, // Optional
|
|
341
|
-
};
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
MSSQL connection characteristics:
|
|
345
|
-
- `encrypt: true` automatically set when using `"mssql-azure"` dialect
|
|
346
|
-
- `trustServerCertificate: true` default setting
|
|
347
|
-
- `useUTC: false` -- Uses local timezone
|
|
348
|
-
|
|
349
|
-
#### PostgreSQL
|
|
350
|
-
|
|
351
|
-
```typescript
|
|
352
|
-
const pgConfig: PostgresqlDbConnConfig = {
|
|
353
|
-
dialect: "postgresql",
|
|
354
|
-
host: "localhost",
|
|
355
|
-
port: 5432, // Optional (default: 5432)
|
|
356
|
-
username: "postgres",
|
|
357
|
-
password: "password",
|
|
358
|
-
database: "mydb", // Optional
|
|
359
|
-
schema: "public", // Optional (PostgreSQL schema)
|
|
360
|
-
defaultIsolationLevel: "READ_UNCOMMITTED", // Optional
|
|
361
|
-
pool: { min: 1, max: 10 }, // Optional
|
|
362
|
-
};
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
## DbConn Interface
|
|
366
|
-
|
|
367
|
-
The common interface implemented by all DBMS-specific connection classes (`MysqlDbConn`, `MssqlDbConn`, `PostgresqlDbConn`) and `PooledDbConn`.
|
|
368
|
-
|
|
369
|
-
| Method/Property | Signature | Description |
|
|
370
|
-
|------------|----------|------|
|
|
371
|
-
| `config` | `DbConnConfig` | Connection config (read-only) |
|
|
372
|
-
| `isConnected` | `boolean` | Connection status |
|
|
373
|
-
| `isInTransaction` | `boolean` | Transaction in progress |
|
|
374
|
-
| `connect()` | `() => Promise<void>` | Establish DB connection |
|
|
375
|
-
| `close()` | `() => Promise<void>` | Close DB connection (PooledDbConn returns to pool) |
|
|
376
|
-
| `beginTransaction()` | `(isolationLevel?: IsolationLevel) => Promise<void>` | Start transaction |
|
|
377
|
-
| `commitTransaction()` | `() => Promise<void>` | Commit transaction |
|
|
378
|
-
| `rollbackTransaction()` | `() => Promise<void>` | Rollback transaction |
|
|
379
|
-
| `execute()` | `(queries: string[]) => Promise<Record<string, unknown>[][]>` | Execute SQL query array |
|
|
380
|
-
| `executeParametrized()` | `(query: string, params?: unknown[]) => Promise<Record<string, unknown>[][]>` | Execute parameterized query |
|
|
381
|
-
| `bulkInsert()` | `(tableName: string, columnMetas: Record<string, ColumnMeta>, records: Record<string, unknown>[]) => Promise<void>` | Native bulk INSERT |
|
|
382
|
-
|
|
383
|
-
`DbConn` extends `EventEmitter<{ close: void }>`, so you can listen for connection close events with `on("close", handler)` / `off("close", handler)`.
|
|
384
|
-
|
|
385
|
-
## NodeDbContextExecutor
|
|
386
|
-
|
|
387
|
-
`NodeDbContextExecutor` implements the `DbContextExecutor` interface from `@simplysm/orm-common`. It is used internally by `createOrm()` but can also be instantiated directly when you need fine-grained control over the executor lifecycle.
|
|
388
|
-
|
|
389
|
-
```typescript
|
|
390
|
-
import { NodeDbContextExecutor } from "@simplysm/orm-node";
|
|
391
|
-
|
|
392
|
-
const executor = new NodeDbContextExecutor({
|
|
393
|
-
dialect: "mysql",
|
|
394
|
-
host: "localhost",
|
|
395
|
-
port: 3306,
|
|
396
|
-
username: "root",
|
|
397
|
-
password: "password",
|
|
398
|
-
database: "mydb",
|
|
399
|
-
});
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
| Method | Signature | Description |
|
|
403
|
-
|--------|-----------|-------------|
|
|
404
|
-
| `connect()` | `() => Promise<void>` | Create a `PooledDbConn` via `createDbConn()` and call `connect()` to acquire from pool |
|
|
405
|
-
| `close()` | `() => Promise<void>` | Return the connection to the pool |
|
|
406
|
-
| `beginTransaction()` | `(isolationLevel?: IsolationLevel) => Promise<void>` | Begin a transaction |
|
|
407
|
-
| `commitTransaction()` | `() => Promise<void>` | Commit the current transaction |
|
|
408
|
-
| `rollbackTransaction()` | `() => Promise<void>` | Roll back the current transaction |
|
|
409
|
-
| `executeParametrized()` | `(query: string, params?: unknown[]) => Promise<Record<string, unknown>[][]>` | Execute a parameterized SQL query |
|
|
410
|
-
| `bulkInsert()` | `(tableName: string, columnMetas: Record<string, ColumnMeta>, records: DataRecord[]) => Promise<void>` | Delegate bulk insert to the underlying connection |
|
|
411
|
-
| `executeDefs()` | `(defs: QueryDef[], resultMetas?: (ResultMeta \| undefined)[]) => Promise<T[][]>` | Build SQL from `QueryDef` array, execute, and parse results using `ResultMeta` |
|
|
412
|
-
|
|
413
|
-
### executeDefs behavior
|
|
414
|
-
|
|
415
|
-
`executeDefs()` is the core method used by `DbContext`. It:
|
|
416
|
-
- Builds SQL strings from `QueryDef` using the appropriate dialect query builder.
|
|
417
|
-
- If all `resultMetas` entries are `undefined`, combines all SQL into a single batch execution and returns empty arrays (used for write-only operations to minimize round-trips).
|
|
418
|
-
- Otherwise, executes each `QueryDef` individually and parses results through `parseQueryResult()` using the corresponding `ResultMeta`. When `ResultMeta` contains `resultSetIndex`, that index selects the correct result set from multi-result-set responses (relevant for MSSQL stored procedures, etc.).
|
|
419
|
-
|
|
420
|
-
## PooledDbConn
|
|
421
|
-
|
|
422
|
-
`PooledDbConn` wraps a physical DBMS connection with pool management. Key behaviors:
|
|
423
|
-
|
|
424
|
-
- **`config` getter**: Returns the inner connection's config if connected, otherwise falls back to the config passed at creation.
|
|
425
|
-
- **`isConnected` / `isInTransaction`**: Delegated to the inner physical connection.
|
|
426
|
-
- **`connect()`**: Acquires a physical connection from `generic-pool`. If the pool factory fails, the error is reported with context from the last creation error.
|
|
427
|
-
- **`close()`**: If a transaction is in progress, automatically attempts rollback before returning the connection to the pool. Emits a `close` event.
|
|
428
|
-
|
|
429
|
-
## OrmOptions
|
|
430
|
-
|
|
431
|
-
Options object passed as the third argument to `createOrm()`.
|
|
432
|
-
|
|
433
|
-
| Field | Type | Description |
|
|
434
|
-
|-------|------|-------------|
|
|
435
|
-
| `database` | `string \| undefined` | Override the `database` from `DbConnConfig` for use in DbContext queries |
|
|
436
|
-
| `schema` | `string \| undefined` | Override the `schema` from `DbConnConfig` for use in DbContext queries |
|
|
437
|
-
|
|
438
|
-
These overrides affect SQL generation (table prefixing) without changing the physical connection target.
|
|
439
|
-
|
|
440
|
-
## Orm Interface
|
|
441
|
-
|
|
442
|
-
The return type of `createOrm()`. Provides the `connect()` and `connectWithoutTransaction()` methods.
|
|
443
|
-
|
|
444
|
-
| Member | Signature | Description |
|
|
445
|
-
|--------|-----------|-------------|
|
|
446
|
-
| `dbContextDef` | `TDef` | The `DbContextDef` passed to `createOrm()` |
|
|
447
|
-
| `config` | `DbConnConfig` | The connection config passed to `createOrm()` |
|
|
448
|
-
| `options` | `OrmOptions \| undefined` | The options passed to `createOrm()` |
|
|
449
|
-
| `connect()` | `(callback, isolationLevel?) => Promise<R>` | Run callback inside a transaction; auto-commits on success, auto-rolls back on error |
|
|
450
|
-
| `connectWithoutTransaction()` | `(callback) => Promise<R>` | Run callback without a transaction |
|
|
451
|
-
|
|
452
|
-
## Supported Databases
|
|
453
|
-
|
|
454
|
-
| Database | Driver Package | dialect Value | Minimum Version |
|
|
455
|
-
|-------------|----------------|------------|----------|
|
|
456
|
-
| MySQL | `mysql2` | `"mysql"` | 8.0.14+ |
|
|
457
|
-
| SQL Server | `tedious` | `"mssql"` | 2012+ |
|
|
458
|
-
| Azure SQL Database | `tedious` | `"mssql-azure"` | - |
|
|
459
|
-
| PostgreSQL | `pg`, `pg-copy-streams` | `"postgresql"` | 9.0+ |
|
|
460
|
-
|
|
461
|
-
## Caveats
|
|
462
|
-
|
|
463
|
-
### Timeouts
|
|
464
|
-
|
|
465
|
-
- Connection establishment timeout is 10 seconds (`DB_CONN_CONNECT_TIMEOUT = 10000ms`).
|
|
466
|
-
- Query default timeout is 10 minutes (`DB_CONN_DEFAULT_TIMEOUT = 600000ms`).
|
|
467
|
-
- Connections are automatically closed if idle for more than twice the query timeout (20 minutes).
|
|
468
|
-
- Connection pool's `acquireTimeoutMillis` (default 30s) and `idleTimeoutMillis` (default 30s) operate separately.
|
|
469
|
-
|
|
470
|
-
### SQL Injection Security
|
|
471
|
-
|
|
472
|
-
`@simplysm/orm-common` uses string escaping instead of parameter binding due to its dynamic query nature. Therefore, when passing user input to ORM queries, you must perform input validation at the application level. Refer to the "ORM Security Guide" in `CLAUDE.md` at the project root for details.
|
|
473
|
-
|
|
474
|
-
### Driver Lazy Loading
|
|
475
|
-
|
|
476
|
-
DBMS-specific drivers (`mysql2`, `tedious`, `pg`) are lazy-loaded within `createDbConn()`. Therefore, import errors won't occur even if unused drivers are not installed.
|
|
477
|
-
|
|
478
|
-
### PooledDbConn close Behavior
|
|
479
|
-
|
|
480
|
-
`PooledDbConn.close()` returns the connection to the pool instead of closing the actual physical connection. If `close()` is called while a transaction is in progress, it automatically attempts to rollback before returning to the pool.
|
|
481
|
-
|
|
482
|
-
## Dependencies
|
|
483
|
-
|
|
484
|
-
| Package | Purpose |
|
|
485
|
-
|--------|------|
|
|
486
|
-
| `mysql2` | MySQL driver |
|
|
487
|
-
| `tedious` | MSSQL driver |
|
|
488
|
-
| `pg` | PostgreSQL driver |
|
|
489
|
-
| `pg-copy-streams` | PostgreSQL bulk COPY support |
|
|
490
|
-
| `generic-pool` | Connection pooling |
|
|
29
|
+
| Source | Exports | Description | Test |
|
|
30
|
+
|--------|---------|-------------|------|
|
|
31
|
+
| `src/create-db-conn.ts` | `createDbConn` | Factory function to create a dialect-specific database connection | `-` |
|
|
32
|
+
| `src/node-db-context-executor.ts` | `NodeDbContextExecutor` | DbContextExecutor that runs queries directly on a local database connection | `-` |
|
|
33
|
+
| `src/pooled-db-conn.ts` | `PooledDbConn` | Connection pool wrapper with configurable pool size and auto-release | `-` |
|
|
34
|
+
| `src/create-orm.ts` | `OrmOptions`, `Orm`, `createOrm` | High-level ORM factory with connection pooling and migration support | `-` |
|
|
491
35
|
|
|
492
36
|
## License
|
|
493
37
|
|
|
@@ -2,9 +2,9 @@ import { EventEmitter } from "@simplysm/core-common";
|
|
|
2
2
|
import type { ColumnMeta, IsolationLevel } from "@simplysm/orm-common";
|
|
3
3
|
import { type DbConn, type MssqlDbConnConfig } from "../types/db-conn";
|
|
4
4
|
/**
|
|
5
|
-
* MSSQL
|
|
5
|
+
* MSSQL database connection class
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* Manages MSSQL/Azure SQL connections using the tedious library.
|
|
8
8
|
*/
|
|
9
9
|
export declare class MssqlDbConn extends EventEmitter<{
|
|
10
10
|
close: void;
|
|
@@ -34,10 +34,10 @@ export declare class MssqlDbConn extends EventEmitter<{
|
|
|
34
34
|
private _convertColumnMetaToTediousBulkColumnDef;
|
|
35
35
|
private _convertDataTypeToTediousBulkColumnType;
|
|
36
36
|
/**
|
|
37
|
-
*
|
|
37
|
+
* Infer the type of a value and return Tedious data type
|
|
38
38
|
*
|
|
39
|
-
* @param value -
|
|
40
|
-
* @throws null/undefined
|
|
39
|
+
* @param value - Value whose type is to be inferred (error if null/undefined is passed)
|
|
40
|
+
* @throws Error if null/undefined is passed
|
|
41
41
|
*/
|
|
42
42
|
private _guessTediousType;
|
|
43
43
|
}
|
|
@@ -156,7 +156,7 @@ class MssqlDbConn extends EventEmitter {
|
|
|
156
156
|
this._startTimeout();
|
|
157
157
|
const conn = this._conn;
|
|
158
158
|
const results = [];
|
|
159
|
-
logger.debug("
|
|
159
|
+
logger.debug("Query execution", { queryLength: query.length, params });
|
|
160
160
|
await new Promise((resolve, reject) => {
|
|
161
161
|
let rejected = false;
|
|
162
162
|
const queryRequest = new this._tedious.Request(query, (err) => {
|
|
@@ -165,20 +165,20 @@ class MssqlDbConn extends EventEmitter {
|
|
|
165
165
|
this._requests = this._requests.filter((r) => r !== queryRequest);
|
|
166
166
|
const errRec = err;
|
|
167
167
|
if (errRec["code"] === "ECANCEL") {
|
|
168
|
-
reject(new SdError(err, "
|
|
168
|
+
reject(new SdError(err, "Query was cancelled."));
|
|
169
169
|
} else {
|
|
170
170
|
const lineNumber = errRec["lineNumber"];
|
|
171
171
|
if (lineNumber != null && lineNumber > 0) {
|
|
172
172
|
const splitQuery = query.split("\n");
|
|
173
173
|
splitQuery[lineNumber - 1] = "==> " + splitQuery[lineNumber - 1];
|
|
174
174
|
reject(
|
|
175
|
-
new SdError(err,
|
|
175
|
+
new SdError(err, `Error executing query
|
|
176
176
|
-- query
|
|
177
177
|
${splitQuery.join("\n")}
|
|
178
178
|
--`)
|
|
179
179
|
);
|
|
180
180
|
} else {
|
|
181
|
-
reject(new SdError(err,
|
|
181
|
+
reject(new SdError(err, `Error executing query
|
|
182
182
|
-- query
|
|
183
183
|
${query}
|
|
184
184
|
--`));
|
|
@@ -205,7 +205,7 @@ ${query}
|
|
|
205
205
|
}
|
|
206
206
|
rejected = true;
|
|
207
207
|
this._requests = this._requests.filter((r) => r !== queryRequest);
|
|
208
|
-
reject(new SdError(err,
|
|
208
|
+
reject(new SdError(err, `Error executing query
|
|
209
209
|
-- query
|
|
210
210
|
${query}
|
|
211
211
|
--`));
|
|
@@ -245,7 +245,7 @@ ${query}
|
|
|
245
245
|
reject(
|
|
246
246
|
new SdError(
|
|
247
247
|
err,
|
|
248
|
-
`Bulk Insert
|
|
248
|
+
`Bulk Insert error
|
|
249
249
|
${jsonStringify(tediousColumnDefs)}
|
|
250
250
|
-- data
|
|
251
251
|
${jsonStringify(records).substring(0, 1e4)}...
|
|
@@ -358,18 +358,18 @@ ${jsonStringify(records).substring(0, 1e4)}...
|
|
|
358
358
|
case "uuid":
|
|
359
359
|
return { type: this._tedious.TYPES.UniqueIdentifier };
|
|
360
360
|
default:
|
|
361
|
-
throw new SdError(
|
|
361
|
+
throw new SdError(`Unsupported DataType: ${JSON.stringify(dataType)}`);
|
|
362
362
|
}
|
|
363
363
|
}
|
|
364
364
|
/**
|
|
365
|
-
*
|
|
365
|
+
* Infer the type of a value and return Tedious data type
|
|
366
366
|
*
|
|
367
|
-
* @param value -
|
|
368
|
-
* @throws null/undefined
|
|
367
|
+
* @param value - Value whose type is to be inferred (error if null/undefined is passed)
|
|
368
|
+
* @throws Error if null/undefined is passed
|
|
369
369
|
*/
|
|
370
370
|
_guessTediousType(value) {
|
|
371
371
|
if (value == null) {
|
|
372
|
-
throw new SdError("_guessTediousType: null/undefined
|
|
372
|
+
throw new SdError("_guessTediousType: null/undefined values are not supported.");
|
|
373
373
|
}
|
|
374
374
|
if (typeof value === "string") {
|
|
375
375
|
return this._tedious.TYPES.NVarChar;
|
|
@@ -383,7 +383,7 @@ ${jsonStringify(records).substring(0, 1e4)}...
|
|
|
383
383
|
if (value instanceof Time) return this._tedious.TYPES.Time;
|
|
384
384
|
if (value instanceof Uuid) return this._tedious.TYPES.UniqueIdentifier;
|
|
385
385
|
if (value instanceof Uint8Array) return this._tedious.TYPES.VarBinary;
|
|
386
|
-
throw new SdError(
|
|
386
|
+
throw new SdError(`Unknown value type: ${typeof value}`);
|
|
387
387
|
}
|
|
388
388
|
}
|
|
389
389
|
export {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/connections/mssql-db-conn.ts"],
|
|
4
|
-
"mappings": "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
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|