@simplysm/orm-common 13.0.68 → 13.0.70
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 +54 -1447
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +9 -9
- package/dist/create-db-context.js.map +1 -1
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +2 -2
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/table-ddl.d.ts +24 -24
- package/dist/ddl/table-ddl.js +4 -4
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +3 -3
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +160 -160
- package/dist/exec/queryable.js +119 -119
- package/dist/exec/queryable.js.map +1 -1
- package/dist/exec/search-parser.d.ts +37 -37
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr.d.ts +257 -257
- package/dist/expr/expr.js +265 -265
- package/dist/expr/expr.js.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
- package/dist/query-builder/base/expr-renderer-base.js +2 -2
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/base/query-builder-base.d.ts +26 -26
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +22 -22
- package/dist/query-builder/base/query-builder-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts +79 -79
- package/dist/schema/factory/column-builder.js +42 -42
- package/dist/schema/factory/index-builder.d.ts +39 -39
- package/dist/schema/factory/index-builder.js +26 -26
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +38 -38
- package/dist/schema/procedure-builder.d.ts +49 -49
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +33 -33
- package/dist/schema/table-builder.d.ts +59 -59
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +43 -43
- package/dist/schema/view-builder.d.ts +49 -49
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +32 -32
- package/dist/types/column.d.ts +22 -22
- package/dist/types/column.js +1 -1
- package/dist/types/column.js.map +1 -1
- package/dist/types/db.d.ts +40 -40
- package/dist/types/expr.d.ts +59 -59
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +44 -44
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +3 -3
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +5 -5
- package/src/create-db-context.ts +20 -20
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +259 -259
- package/src/ddl/relation-ddl.ts +89 -89
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +189 -189
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +2033 -2033
- package/src/exec/search-parser.ts +57 -57
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +2140 -2140
- package/src/query-builder/base/expr-renderer-base.ts +237 -237
- package/src/query-builder/base/query-builder-base.ts +213 -213
- package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
- package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
- package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
- package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
- package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
- package/src/query-builder/query-builder.ts +19 -19
- package/src/schema/factory/column-builder.ts +423 -423
- package/src/schema/factory/index-builder.ts +164 -164
- package/src/schema/factory/relation-builder.ts +453 -453
- package/src/schema/procedure-builder.ts +232 -232
- package/src/schema/table-builder.ts +319 -319
- package/src/schema/view-builder.ts +221 -221
- package/src/types/column.ts +188 -188
- package/src/types/db.ts +208 -208
- package/src/types/expr.ts +697 -697
- package/src/types/query-def.ts +513 -513
- package/src/utils/result-parser.ts +458 -458
- package/tests/db-context/create-db-context.spec.ts +224 -0
- package/tests/db-context/define-db-context.spec.ts +68 -0
- package/tests/ddl/basic.expected.ts +341 -0
- package/tests/ddl/basic.spec.ts +714 -0
- package/tests/ddl/column-builder.expected.ts +310 -0
- package/tests/ddl/column-builder.spec.ts +637 -0
- package/tests/ddl/index-builder.expected.ts +38 -0
- package/tests/ddl/index-builder.spec.ts +202 -0
- package/tests/ddl/procedure-builder.expected.ts +52 -0
- package/tests/ddl/procedure-builder.spec.ts +234 -0
- package/tests/ddl/relation-builder.expected.ts +36 -0
- package/tests/ddl/relation-builder.spec.ts +372 -0
- package/tests/ddl/table-builder.expected.ts +113 -0
- package/tests/ddl/table-builder.spec.ts +433 -0
- package/tests/ddl/view-builder.expected.ts +38 -0
- package/tests/ddl/view-builder.spec.ts +176 -0
- package/tests/dml/delete.expected.ts +96 -0
- package/tests/dml/delete.spec.ts +160 -0
- package/tests/dml/insert.expected.ts +192 -0
- package/tests/dml/insert.spec.ts +288 -0
- package/tests/dml/update.expected.ts +176 -0
- package/tests/dml/update.spec.ts +318 -0
- package/tests/dml/upsert.expected.ts +215 -0
- package/tests/dml/upsert.spec.ts +242 -0
- package/tests/errors/queryable-errors.spec.ts +177 -0
- package/tests/escape.spec.ts +100 -0
- package/tests/examples/pivot.expected.ts +211 -0
- package/tests/examples/pivot.spec.ts +533 -0
- package/tests/examples/sampling.expected.ts +69 -0
- package/tests/examples/sampling.spec.ts +104 -0
- package/tests/examples/unpivot.expected.ts +120 -0
- package/tests/examples/unpivot.spec.ts +226 -0
- package/tests/exec/search-parser.spec.ts +283 -0
- package/tests/executable/basic.expected.ts +18 -0
- package/tests/executable/basic.spec.ts +54 -0
- package/tests/expr/comparison.expected.ts +282 -0
- package/tests/expr/comparison.spec.ts +400 -0
- package/tests/expr/conditional.expected.ts +134 -0
- package/tests/expr/conditional.spec.ts +276 -0
- package/tests/expr/date.expected.ts +332 -0
- package/tests/expr/date.spec.ts +526 -0
- package/tests/expr/math.expected.ts +62 -0
- package/tests/expr/math.spec.ts +106 -0
- package/tests/expr/string.expected.ts +218 -0
- package/tests/expr/string.spec.ts +356 -0
- package/tests/expr/utility.expected.ts +147 -0
- package/tests/expr/utility.spec.ts +182 -0
- package/tests/select/basic.expected.ts +322 -0
- package/tests/select/basic.spec.ts +502 -0
- package/tests/select/filter.expected.ts +357 -0
- package/tests/select/filter.spec.ts +1068 -0
- package/tests/select/group.expected.ts +169 -0
- package/tests/select/group.spec.ts +244 -0
- package/tests/select/join.expected.ts +582 -0
- package/tests/select/join.spec.ts +805 -0
- package/tests/select/order.expected.ts +150 -0
- package/tests/select/order.spec.ts +189 -0
- package/tests/select/recursive-cte.expected.ts +244 -0
- package/tests/select/recursive-cte.spec.ts +514 -0
- package/tests/select/result-meta.spec.ts +270 -0
- package/tests/select/subquery.expected.ts +363 -0
- package/tests/select/subquery.spec.ts +537 -0
- package/tests/select/view.expected.ts +155 -0
- package/tests/select/view.spec.ts +235 -0
- package/tests/select/window.expected.ts +345 -0
- package/tests/select/window.spec.ts +618 -0
- package/tests/setup/MockExecutor.ts +18 -0
- package/tests/setup/TestDbContext.ts +59 -0
- package/tests/setup/models/Company.ts +13 -0
- package/tests/setup/models/Employee.ts +10 -0
- package/tests/setup/models/MonthlySales.ts +11 -0
- package/tests/setup/models/Post.ts +16 -0
- package/tests/setup/models/Sales.ts +10 -0
- package/tests/setup/models/User.ts +19 -0
- package/tests/setup/procedure/GetAllUsers.ts +9 -0
- package/tests/setup/procedure/GetUserById.ts +12 -0
- package/tests/setup/test-utils.ts +72 -0
- package/tests/setup/views/ActiveUsers.ts +8 -0
- package/tests/setup/views/UserSummary.ts +11 -0
- package/tests/types/nullable-queryable-record.spec.ts +145 -0
- package/tests/utils/result-parser-perf.spec.ts +210 -0
- package/tests/utils/result-parser.spec.ts +701 -0
- package/docs/expressions.md +0 -172
- package/docs/queries.md +0 -444
- package/docs/schema.md +0 -245
package/docs/schema.md
DELETED
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
# Schema Definition
|
|
2
|
-
|
|
3
|
-
## Table Definition
|
|
4
|
-
|
|
5
|
-
Define table schema using the `Table()` factory function and Fluent API.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
import { Table } from "@simplysm/orm-common";
|
|
9
|
-
|
|
10
|
-
const User = Table("User")
|
|
11
|
-
.database("mydb")
|
|
12
|
-
.columns((c) => ({
|
|
13
|
-
id: c.bigint().autoIncrement(),
|
|
14
|
-
name: c.varchar(100),
|
|
15
|
-
email: c.varchar(200).nullable(),
|
|
16
|
-
isActive: c.boolean().default(true),
|
|
17
|
-
createdAt: c.datetime(),
|
|
18
|
-
}))
|
|
19
|
-
.primaryKey("id")
|
|
20
|
-
.indexes((i) => [
|
|
21
|
-
i.index("email").unique(),
|
|
22
|
-
i.index("name", "createdAt").orderBy("ASC", "DESC"),
|
|
23
|
-
]);
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Column Types
|
|
27
|
-
|
|
28
|
-
| Factory Method | SQL Type | TypeScript Type |
|
|
29
|
-
|--------------|----------|----------------|
|
|
30
|
-
| `c.int()` | INT | `number` |
|
|
31
|
-
| `c.bigint()` | BIGINT | `number` |
|
|
32
|
-
| `c.float()` | FLOAT | `number` |
|
|
33
|
-
| `c.double()` | DOUBLE | `number` |
|
|
34
|
-
| `c.decimal(p, s)` | DECIMAL(p, s) | `number` |
|
|
35
|
-
| `c.varchar(n)` | VARCHAR(n) | `string` |
|
|
36
|
-
| `c.char(n)` | CHAR(n) | `string` |
|
|
37
|
-
| `c.text()` | TEXT | `string` |
|
|
38
|
-
| `c.boolean()` | BOOLEAN / BIT / TINYINT(1) | `boolean` |
|
|
39
|
-
| `c.datetime()` | DATETIME | `DateTime` |
|
|
40
|
-
| `c.date()` | DATE | `DateOnly` |
|
|
41
|
-
| `c.time()` | TIME | `Time` |
|
|
42
|
-
| `c.uuid()` | UUID / UNIQUEIDENTIFIER / BINARY(16) | `Uuid` |
|
|
43
|
-
| `c.binary()` | BLOB / VARBINARY(MAX) / BYTEA | `Bytes` |
|
|
44
|
-
|
|
45
|
-
> **Important:** `c.int()` and `c.bigint()` both map to TypeScript `number`, **not** JavaScript's native `BigInt`.
|
|
46
|
-
> The names `int` / `bigint` refer to SQL data types (storage size), not JavaScript types.
|
|
47
|
-
> Do not use `BigInt` literals (e.g. `1n`) or the `bigint` TypeScript type with this ORM.
|
|
48
|
-
|
|
49
|
-
## Column Options
|
|
50
|
-
|
|
51
|
-
| Method | Description |
|
|
52
|
-
|--------|------|
|
|
53
|
-
| `.autoIncrement()` | Auto increment (optional on INSERT) |
|
|
54
|
-
| `.nullable()` | Allow NULL (adds `undefined` to type) |
|
|
55
|
-
| `.default(value)` | Set default value (optional on INSERT) |
|
|
56
|
-
| `.description(text)` | Column description (DDL comment) |
|
|
57
|
-
|
|
58
|
-
## Relationship Definition
|
|
59
|
-
|
|
60
|
-
Define relationships between tables to enable automatic JOINs via `include()`.
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
const Post = Table("Post")
|
|
64
|
-
.database("mydb")
|
|
65
|
-
.columns((c) => ({
|
|
66
|
-
id: c.bigint().autoIncrement(),
|
|
67
|
-
authorId: c.bigint(),
|
|
68
|
-
title: c.varchar(200),
|
|
69
|
-
content: c.text(),
|
|
70
|
-
}))
|
|
71
|
-
.primaryKey("id")
|
|
72
|
-
.relations((r) => ({
|
|
73
|
-
// N:1 relationship - Post.authorId → User.id (creates DB FK)
|
|
74
|
-
author: r.foreignKey(["authorId"], () => User),
|
|
75
|
-
}));
|
|
76
|
-
|
|
77
|
-
const User = Table("User")
|
|
78
|
-
.database("mydb")
|
|
79
|
-
.columns((c) => ({
|
|
80
|
-
id: c.bigint().autoIncrement(),
|
|
81
|
-
name: c.varchar(100),
|
|
82
|
-
}))
|
|
83
|
-
.primaryKey("id")
|
|
84
|
-
.relations((r) => ({
|
|
85
|
-
// 1:N reverse reference - User ← Post.author
|
|
86
|
-
posts: r.foreignKeyTarget(() => Post, "author"),
|
|
87
|
-
|
|
88
|
-
// 1:1 relationship (single object)
|
|
89
|
-
profile: r.foreignKeyTarget(() => Profile, "user").single(),
|
|
90
|
-
}));
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Relationship Builder Types
|
|
94
|
-
|
|
95
|
-
| Method | Cardinality | Creates DB FK | Available For |
|
|
96
|
-
|--------|-----------|-----------|--------------|
|
|
97
|
-
| `r.foreignKey(cols, targetFn)` | N:1 | Yes | Table |
|
|
98
|
-
| `r.foreignKeyTarget(targetFn, relName)` | 1:N | - | Table |
|
|
99
|
-
| `r.relationKey(cols, targetFn)` | N:1 | No | Table, View |
|
|
100
|
-
| `r.relationKeyTarget(targetFn, relName)` | 1:N | - | Table, View |
|
|
101
|
-
|
|
102
|
-
Calling `.single()` on `foreignKeyTarget` / `relationKeyTarget` establishes a 1:1 relationship (returns single object instead of array).
|
|
103
|
-
|
|
104
|
-
## DbContext Configuration
|
|
105
|
-
|
|
106
|
-
### Functional API (Recommended)
|
|
107
|
-
|
|
108
|
-
Register tables, views, and procedures using `defineDbContext`.
|
|
109
|
-
|
|
110
|
-
```typescript
|
|
111
|
-
import { defineDbContext, createDbContext, createColumnFactory } from "@simplysm/orm-common";
|
|
112
|
-
|
|
113
|
-
const MyDbDef = defineDbContext({
|
|
114
|
-
tables: { user: User, post: Post },
|
|
115
|
-
views: { activeUsers: ActiveUsers },
|
|
116
|
-
procedures: { getUserById: GetUserById },
|
|
117
|
-
migrations: [
|
|
118
|
-
{
|
|
119
|
-
name: "20260101_add_status",
|
|
120
|
-
up: async (db) => {
|
|
121
|
-
const c = createColumnFactory();
|
|
122
|
-
await db.addColumn(
|
|
123
|
-
{ database: "mydb", name: "User" },
|
|
124
|
-
"status",
|
|
125
|
-
c.varchar(20).nullable(),
|
|
126
|
-
);
|
|
127
|
-
},
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
// Create instance with executor (from orm-node package)
|
|
133
|
-
const db = createDbContext(MyDbDef, executor, { database: "mydb" });
|
|
134
|
-
|
|
135
|
-
// Use queryable accessors
|
|
136
|
-
await db.connect(async () => {
|
|
137
|
-
const users = await db.user().result();
|
|
138
|
-
const result = await db.getUserById().execute({ userId: 1 });
|
|
139
|
-
});
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### Low-level Utilities (Advanced)
|
|
143
|
-
|
|
144
|
-
`queryable()` and `executable()` are the underlying factory functions used internally by `createDbContext()`. They can be used directly when implementing a custom `DbContextBase`.
|
|
145
|
-
|
|
146
|
-
```typescript
|
|
147
|
-
import { queryable, executable, type DbContextBase } from "@simplysm/orm-common";
|
|
148
|
-
|
|
149
|
-
// queryable(db, tableOrView, as?) - creates a () => Queryable factory
|
|
150
|
-
const getUserQueryable = queryable(db, User);
|
|
151
|
-
const userQueryable = getUserQueryable(); // returns Queryable<UserData, typeof User>
|
|
152
|
-
|
|
153
|
-
// executable(db, procedure) - creates a () => Executable factory
|
|
154
|
-
const getByIdExecutable = executable(db, GetUserById);
|
|
155
|
-
const exec = getByIdExecutable(); // returns Executable<Params, Returns>
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
> For most use cases, `createDbContext()` is preferred and manages `queryable`/`executable` automatically.
|
|
159
|
-
|
|
160
|
-
## View Definition
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
import { View, expr, type DbContextInstance } from "@simplysm/orm-common";
|
|
164
|
-
|
|
165
|
-
const ActiveUsers = View("ActiveUsers")
|
|
166
|
-
.database("mydb")
|
|
167
|
-
.query((db: DbContextInstance<any>) =>
|
|
168
|
-
db.user()
|
|
169
|
-
.where((u) => [expr.eq(u.isActive, true)])
|
|
170
|
-
.select((u) => ({
|
|
171
|
-
id: u.id,
|
|
172
|
-
name: u.name,
|
|
173
|
-
email: u.email,
|
|
174
|
-
}))
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
// Define logical relationships on views (no DB FK)
|
|
178
|
-
const UserSummary = View("UserSummary")
|
|
179
|
-
.database("mydb")
|
|
180
|
-
.query((db: DbContextInstance<any>) =>
|
|
181
|
-
db.user().select((u) => ({
|
|
182
|
-
id: u.id,
|
|
183
|
-
name: u.name,
|
|
184
|
-
companyId: u.companyId,
|
|
185
|
-
}))
|
|
186
|
-
)
|
|
187
|
-
.relations((r) => ({
|
|
188
|
-
company: r.relationKey(["companyId"], () => Company),
|
|
189
|
-
}));
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## Procedure Definition
|
|
193
|
-
|
|
194
|
-
```typescript
|
|
195
|
-
import { Procedure, defineDbContext, createDbContext } from "@simplysm/orm-common";
|
|
196
|
-
|
|
197
|
-
const GetUserById = Procedure("GetUserById")
|
|
198
|
-
.database("mydb")
|
|
199
|
-
.params((c) => ({
|
|
200
|
-
userId: c.bigint(),
|
|
201
|
-
}))
|
|
202
|
-
.returns((c) => ({
|
|
203
|
-
id: c.bigint(),
|
|
204
|
-
name: c.varchar(100),
|
|
205
|
-
email: c.varchar(200),
|
|
206
|
-
}))
|
|
207
|
-
.body("SELECT id, name, email FROM User WHERE id = userId");
|
|
208
|
-
|
|
209
|
-
// Register in DbContext
|
|
210
|
-
const MyDbDef = defineDbContext({
|
|
211
|
-
procedures: { getUserById: GetUserById },
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
const db = createDbContext(MyDbDef, executor, { database: "mydb" });
|
|
215
|
-
|
|
216
|
-
// Invoke
|
|
217
|
-
const result = await db.getUserById().execute({ userId: 1 });
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
## Type Inference
|
|
221
|
-
|
|
222
|
-
`TableBuilder` automatically infers types from column definitions.
|
|
223
|
-
|
|
224
|
-
```typescript
|
|
225
|
-
const User = Table("User")
|
|
226
|
-
.columns((c) => ({
|
|
227
|
-
id: c.bigint().autoIncrement(),
|
|
228
|
-
name: c.varchar(100),
|
|
229
|
-
email: c.varchar(200).nullable(),
|
|
230
|
-
status: c.varchar(20).default("active"),
|
|
231
|
-
}))
|
|
232
|
-
.primaryKey("id");
|
|
233
|
-
|
|
234
|
-
// $infer: Full type (columns + relations)
|
|
235
|
-
type UserData = typeof User.$infer;
|
|
236
|
-
// { id: number; name: string; email: string | undefined; status: string; }
|
|
237
|
-
|
|
238
|
-
// $inferInsert: For INSERT (autoIncrement/nullable/default are optional)
|
|
239
|
-
type UserInsert = typeof User.$inferInsert;
|
|
240
|
-
// { name: string; } & { id?: number; email?: string; status?: string; }
|
|
241
|
-
|
|
242
|
-
// $inferUpdate: For UPDATE (all fields optional)
|
|
243
|
-
type UserUpdate = typeof User.$inferUpdate;
|
|
244
|
-
// { id?: number; name?: string; email?: string; status?: string; }
|
|
245
|
-
```
|