@kood/claude-code 0.1.5 → 0.1.7
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/dist/index.js +21 -243
- package/package.json +1 -1
- package/templates/hono/CLAUDE.md +10 -6
- package/templates/hono/docs/deployment/index.md +5 -0
- package/templates/hono/docs/library/hono/index.md +6 -0
- package/templates/hono/docs/library/prisma/index.md +3 -0
- package/templates/npx/CLAUDE.md +8 -2
- package/templates/tanstack-start/CLAUDE.md +105 -259
- package/templates/tanstack-start/docs/deployment/cloudflare.md +37 -424
- package/templates/tanstack-start/docs/deployment/index.md +57 -286
- package/templates/tanstack-start/docs/deployment/nitro.md +36 -318
- package/templates/tanstack-start/docs/deployment/railway.md +40 -409
- package/templates/tanstack-start/docs/deployment/vercel.md +43 -465
- package/templates/tanstack-start/docs/design/accessibility.md +56 -326
- package/templates/tanstack-start/docs/design/color.md +37 -179
- package/templates/tanstack-start/docs/design/components.md +77 -311
- package/templates/tanstack-start/docs/design/index.md +24 -87
- package/templates/tanstack-start/docs/design/safe-area.md +51 -250
- package/templates/tanstack-start/docs/design/spacing.md +57 -276
- package/templates/tanstack-start/docs/design/tailwind-setup.md +45 -359
- package/templates/tanstack-start/docs/design/typography.md +40 -284
- package/templates/tanstack-start/docs/guides/best-practices.md +3 -8
- package/templates/tanstack-start/docs/guides/env-setup.md +3 -3
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +27 -115
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +22 -105
- package/templates/tanstack-start/docs/library/better-auth/index.md +17 -66
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +11 -88
- package/templates/tanstack-start/docs/library/better-auth/session.md +12 -92
- package/templates/tanstack-start/docs/library/better-auth/setup.md +9 -91
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +30 -358
- package/templates/tanstack-start/docs/library/prisma/config.md +27 -327
- package/templates/tanstack-start/docs/library/prisma/crud.md +46 -174
- package/templates/tanstack-start/docs/library/prisma/index.md +23 -113
- package/templates/tanstack-start/docs/library/prisma/relations.md +31 -153
- package/templates/tanstack-start/docs/library/prisma/schema.md +40 -217
- package/templates/tanstack-start/docs/library/prisma/setup.md +13 -113
- package/templates/tanstack-start/docs/library/prisma/transactions.md +20 -110
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -99
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +28 -107
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +44 -146
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +11 -73
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +33 -127
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +49 -149
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +19 -112
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +33 -80
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +28 -106
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +21 -118
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +41 -172
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +6 -39
- package/templates/tanstack-start/docs/library/zod/basic-types.md +33 -145
- package/templates/tanstack-start/docs/library/zod/complex-types.md +32 -156
- package/templates/tanstack-start/docs/library/zod/index.md +22 -150
- package/templates/tanstack-start/docs/library/zod/transforms.md +20 -129
- package/templates/tanstack-start/docs/library/zod/validation.md +39 -155
- package/templates/hono/docs/commands/git.md +0 -145
- package/templates/hono/docs/mcp/context7.md +0 -106
- package/templates/hono/docs/mcp/index.md +0 -176
- package/templates/hono/docs/mcp/sequential-thinking.md +0 -101
- package/templates/hono/docs/mcp/serena.md +0 -269
- package/templates/hono/docs/mcp/sgrep.md +0 -105
- package/templates/hono/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +0 -136
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +0 -303
- package/templates/npx/docs/commands/git.md +0 -145
- package/templates/npx/docs/mcp/index.md +0 -60
- package/templates/npx/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +0 -134
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +0 -301
- package/templates/tanstack-start/docs/commands/git.md +0 -145
- package/templates/tanstack-start/docs/mcp/context7.md +0 -204
- package/templates/tanstack-start/docs/mcp/index.md +0 -177
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +0 -180
- package/templates/tanstack-start/docs/mcp/serena.md +0 -269
- package/templates/tanstack-start/docs/mcp/sgrep.md +0 -174
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +0 -220
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +0 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +0 -292
|
@@ -1,235 +1,65 @@
|
|
|
1
|
-
# Prisma - Config 파일
|
|
1
|
+
# Prisma - Config 파일
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Prisma v7 `prisma.config.ts` 설정.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## ⚠️ 필수: Multi-File 스키마 설정
|
|
10
|
-
|
|
11
|
-
Multi-File 스키마를 사용하려면 **반드시** `prisma.config.ts`에서 스키마 폴더를 지정해야 합니다.
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
// prisma.config.ts
|
|
15
|
-
import path from 'node:path'
|
|
16
|
-
import { defineConfig, env } from 'prisma/config'
|
|
17
|
-
|
|
18
|
-
export default defineConfig({
|
|
19
|
-
// Multi-File 스키마 폴더 지정
|
|
20
|
-
schema: path.join('prisma', 'schema'),
|
|
21
|
-
datasource: {
|
|
22
|
-
url: env('DATABASE_URL'),
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## 파일 위치 및 이름
|
|
30
|
-
|
|
31
|
-
### 지원되는 파일명
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
prisma.config.ts # 권장 (소규모 프로젝트)
|
|
35
|
-
prisma.config.js
|
|
36
|
-
prisma.config.mjs
|
|
37
|
-
prisma.config.cjs
|
|
38
|
-
prisma.config.mts
|
|
39
|
-
prisma.config.cts
|
|
40
|
-
|
|
41
|
-
.config/prisma.ts # 권장 (대규모 프로젝트)
|
|
42
|
-
.config/prisma.js
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 권장 위치
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
프로젝트/
|
|
49
|
-
├── prisma.config.ts # 프로젝트 루트
|
|
50
|
-
├── prisma/
|
|
51
|
-
│ ├── schema/ # Multi-File 스키마 폴더
|
|
52
|
-
│ │ ├── +base.prisma
|
|
53
|
-
│ │ ├── +enum.prisma
|
|
54
|
-
│ │ └── user.prisma
|
|
55
|
-
│ └── migrations/ # 마이그레이션 폴더
|
|
56
|
-
└── package.json
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 설정 옵션
|
|
62
|
-
|
|
63
|
-
### 전체 옵션 목록
|
|
64
|
-
|
|
65
|
-
| 옵션 | 타입 | 필수 | 설명 |
|
|
66
|
-
|------|------|------|------|
|
|
67
|
-
| `schema` | string | ❌ | 스키마 파일 또는 폴더 경로 |
|
|
68
|
-
| `datasource.url` | string | ✅ | 데이터베이스 연결 URL |
|
|
69
|
-
| `datasource.shadowDatabaseUrl` | string | ❌ | Shadow DB URL |
|
|
70
|
-
| `migrations.path` | string | ❌ | 마이그레이션 폴더 경로 |
|
|
71
|
-
| `migrations.seed` | string | ❌ | 시드 스크립트 명령어 |
|
|
72
|
-
| `migrations.initShadowDb` | string | ❌ | Shadow DB 초기화 SQL |
|
|
73
|
-
| `views.path` | string | ❌ | SQL 뷰 정의 폴더 |
|
|
74
|
-
| `typedSql.path` | string | ❌ | TypedSQL 파일 폴더 |
|
|
75
|
-
| `experimental` | object | ❌ | 실험적 기능 활성화 |
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 기본 설정 예시
|
|
80
|
-
|
|
81
|
-
### defineConfig 사용 (권장)
|
|
5
|
+
## Multi-File 스키마 (필수)
|
|
82
6
|
|
|
83
7
|
```typescript
|
|
84
8
|
// prisma.config.ts
|
|
85
9
|
import 'dotenv/config'
|
|
10
|
+
import path from 'node:path'
|
|
86
11
|
import { defineConfig, env } from 'prisma/config'
|
|
87
12
|
|
|
88
13
|
export default defineConfig({
|
|
89
|
-
//
|
|
90
|
-
schema: 'prisma/schema',
|
|
91
|
-
|
|
92
|
-
// 마이그레이션 설정
|
|
14
|
+
schema: path.join('prisma', 'schema'), // 폴더 경로!
|
|
93
15
|
migrations: {
|
|
94
16
|
path: 'prisma/migrations',
|
|
95
17
|
seed: 'tsx prisma/seed.ts',
|
|
96
18
|
},
|
|
97
|
-
|
|
98
|
-
// 데이터베이스 연결
|
|
99
19
|
datasource: {
|
|
100
20
|
url: env('DATABASE_URL'),
|
|
101
21
|
},
|
|
102
22
|
})
|
|
103
23
|
```
|
|
104
24
|
|
|
105
|
-
|
|
25
|
+
## 폴더 구조
|
|
106
26
|
|
|
107
|
-
```typescript
|
|
108
|
-
// prisma.config.ts
|
|
109
|
-
import 'dotenv/config'
|
|
110
|
-
import type { PrismaConfig } from 'prisma'
|
|
111
|
-
import { env } from 'prisma/config'
|
|
112
|
-
|
|
113
|
-
export default {
|
|
114
|
-
schema: 'prisma/schema',
|
|
115
|
-
migrations: {
|
|
116
|
-
path: 'prisma/migrations',
|
|
117
|
-
seed: 'tsx prisma/seed.ts',
|
|
118
|
-
},
|
|
119
|
-
datasource: {
|
|
120
|
-
url: env('DATABASE_URL'),
|
|
121
|
-
},
|
|
122
|
-
} satisfies PrismaConfig
|
|
123
27
|
```
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
// prisma.config.ts
|
|
133
|
-
import path from 'node:path'
|
|
134
|
-
import { defineConfig, env } from 'prisma/config'
|
|
135
|
-
|
|
136
|
-
export default defineConfig({
|
|
137
|
-
// ⚠️ 폴더 경로 지정 (파일이 아님!)
|
|
138
|
-
schema: path.join('prisma', 'schema'),
|
|
139
|
-
datasource: {
|
|
140
|
-
url: env('DATABASE_URL'),
|
|
141
|
-
},
|
|
142
|
-
})
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### 폴더 구조
|
|
146
|
-
|
|
147
|
-
```
|
|
148
|
-
prisma/
|
|
149
|
-
├── schema/ # Multi-File 스키마 폴더
|
|
150
|
-
│ ├── +base.prisma # datasource, generator 설정
|
|
151
|
-
│ ├── +enum.prisma # 모든 enum 정의
|
|
152
|
-
│ ├── user.prisma # User 모델
|
|
153
|
-
│ ├── post.prisma # Post 모델
|
|
154
|
-
│ └── ...
|
|
155
|
-
└── migrations/ # ⚠️ datasource와 같은 레벨에 위치
|
|
28
|
+
프로젝트/
|
|
29
|
+
├── prisma.config.ts
|
|
30
|
+
├── prisma/
|
|
31
|
+
│ ├── schema/
|
|
32
|
+
│ │ ├── +base.prisma # datasource, generator
|
|
33
|
+
│ │ ├── +enum.prisma # enum 정의
|
|
34
|
+
│ │ └── user.prisma # 모델
|
|
35
|
+
│ └── migrations/
|
|
156
36
|
```
|
|
157
37
|
|
|
158
|
-
|
|
38
|
+
## +base.prisma
|
|
159
39
|
|
|
160
40
|
```prisma
|
|
161
|
-
// prisma/schema/+base.prisma
|
|
162
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
163
|
-
// Prisma 기본 설정 파일
|
|
164
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
165
|
-
|
|
166
|
-
// 데이터베이스 연결 설정
|
|
167
41
|
datasource db {
|
|
168
42
|
provider = "postgresql"
|
|
169
43
|
url = env("DATABASE_URL")
|
|
170
44
|
}
|
|
171
45
|
|
|
172
|
-
// Prisma Client 생성 설정
|
|
173
46
|
generator client {
|
|
174
|
-
provider = "prisma-client"
|
|
47
|
+
provider = "prisma-client"
|
|
175
48
|
output = "../../generated/prisma"
|
|
176
49
|
}
|
|
177
50
|
```
|
|
178
51
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
## 환경 변수 설정
|
|
182
|
-
|
|
183
|
-
### dotenv 설치
|
|
184
|
-
|
|
185
|
-
```bash
|
|
186
|
-
npm install dotenv
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### 환경 변수 사용
|
|
190
|
-
|
|
191
|
-
```typescript
|
|
192
|
-
// prisma.config.ts
|
|
193
|
-
import 'dotenv/config' // ⚠️ 반드시 최상단에 import
|
|
194
|
-
import { defineConfig, env } from 'prisma/config'
|
|
195
|
-
|
|
196
|
-
export default defineConfig({
|
|
197
|
-
schema: 'prisma/schema',
|
|
198
|
-
datasource: {
|
|
199
|
-
url: env('DATABASE_URL'), // 타입 안전한 환경 변수 접근
|
|
200
|
-
},
|
|
201
|
-
})
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### .env 파일
|
|
205
|
-
|
|
206
|
-
```env
|
|
207
|
-
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## 마이그레이션 설정
|
|
52
|
+
## 설정 옵션
|
|
213
53
|
|
|
214
|
-
|
|
54
|
+
| 옵션 | 설명 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| `schema` | 스키마 폴더 경로 |
|
|
57
|
+
| `datasource.url` | DB URL (필수) |
|
|
58
|
+
| `datasource.shadowDatabaseUrl` | Shadow DB URL |
|
|
59
|
+
| `migrations.path` | 마이그레이션 폴더 |
|
|
60
|
+
| `migrations.seed` | 시드 명령어 |
|
|
215
61
|
|
|
216
|
-
|
|
217
|
-
// prisma.config.ts
|
|
218
|
-
import { defineConfig, env } from 'prisma/config'
|
|
219
|
-
|
|
220
|
-
export default defineConfig({
|
|
221
|
-
schema: 'prisma/schema',
|
|
222
|
-
migrations: {
|
|
223
|
-
path: 'prisma/migrations',
|
|
224
|
-
seed: 'tsx prisma/seed.ts', // 시드 명령어
|
|
225
|
-
},
|
|
226
|
-
datasource: {
|
|
227
|
-
url: env('DATABASE_URL'),
|
|
228
|
-
},
|
|
229
|
-
})
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### 시드 파일 예시
|
|
62
|
+
## 시드 파일
|
|
233
63
|
|
|
234
64
|
```typescript
|
|
235
65
|
// prisma/seed.ts
|
|
@@ -238,140 +68,10 @@ import { PrismaClient } from '../generated/prisma'
|
|
|
238
68
|
const prisma = new PrismaClient()
|
|
239
69
|
|
|
240
70
|
async function main() {
|
|
241
|
-
// 초기 데이터 생성
|
|
242
71
|
await prisma.user.create({
|
|
243
|
-
data: {
|
|
244
|
-
email: 'admin@example.com',
|
|
245
|
-
name: '관리자',
|
|
246
|
-
role: 'ADMIN',
|
|
247
|
-
},
|
|
72
|
+
data: { email: 'admin@example.com', name: '관리자', role: 'ADMIN' },
|
|
248
73
|
})
|
|
249
74
|
}
|
|
250
75
|
|
|
251
|
-
main()
|
|
252
|
-
.catch(console.error)
|
|
253
|
-
.finally(() => prisma.$disconnect())
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Shadow Database 설정
|
|
259
|
-
|
|
260
|
-
마이그레이션 시 사용되는 임시 데이터베이스입니다.
|
|
261
|
-
|
|
262
|
-
```typescript
|
|
263
|
-
// prisma.config.ts
|
|
264
|
-
import { defineConfig, env } from 'prisma/config'
|
|
265
|
-
|
|
266
|
-
export default defineConfig({
|
|
267
|
-
schema: 'prisma/schema',
|
|
268
|
-
datasource: {
|
|
269
|
-
url: env('DATABASE_URL'),
|
|
270
|
-
shadowDatabaseUrl: env('SHADOW_DATABASE_URL'),
|
|
271
|
-
},
|
|
272
|
-
})
|
|
76
|
+
main().catch(console.error).finally(() => prisma.$disconnect())
|
|
273
77
|
```
|
|
274
|
-
|
|
275
|
-
---
|
|
276
|
-
|
|
277
|
-
## 실험적 기능
|
|
278
|
-
|
|
279
|
-
### External Tables
|
|
280
|
-
|
|
281
|
-
외부에서 관리되는 테이블 설정:
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
// prisma.config.ts
|
|
285
|
-
import { defineConfig, env } from 'prisma/config'
|
|
286
|
-
|
|
287
|
-
export default defineConfig({
|
|
288
|
-
schema: 'prisma/schema',
|
|
289
|
-
experimental: {
|
|
290
|
-
externalTables: true,
|
|
291
|
-
},
|
|
292
|
-
tables: {
|
|
293
|
-
external: ['public.users'],
|
|
294
|
-
},
|
|
295
|
-
enums: {
|
|
296
|
-
external: ['public.role'],
|
|
297
|
-
},
|
|
298
|
-
datasource: {
|
|
299
|
-
url: env('DATABASE_URL'),
|
|
300
|
-
},
|
|
301
|
-
})
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
## 경로 해석 규칙
|
|
307
|
-
|
|
308
|
-
### 중요 사항
|
|
309
|
-
|
|
310
|
-
- 모든 경로는 **config 파일 위치 기준**으로 해석됩니다
|
|
311
|
-
- CLI 명령어 실행 위치가 아닙니다!
|
|
312
|
-
|
|
313
|
-
### 예시
|
|
314
|
-
|
|
315
|
-
```
|
|
316
|
-
프로젝트/
|
|
317
|
-
├── prisma.config.ts # 여기가 기준!
|
|
318
|
-
├── prisma/
|
|
319
|
-
│ └── schema/
|
|
320
|
-
└── src/
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
```typescript
|
|
324
|
-
// prisma.config.ts
|
|
325
|
-
export default defineConfig({
|
|
326
|
-
// ✅ prisma.config.ts 기준 상대 경로
|
|
327
|
-
schema: 'prisma/schema',
|
|
328
|
-
|
|
329
|
-
// ❌ 이렇게 하지 마세요
|
|
330
|
-
schema: './prisma/schema', // ./ 불필요
|
|
331
|
-
})
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### 커스텀 경로 지정
|
|
335
|
-
|
|
336
|
-
```bash
|
|
337
|
-
# --config 플래그로 config 파일 위치 지정
|
|
338
|
-
npx prisma validate --config ./path/to/myconfig.ts
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
## 전체 설정 예시
|
|
344
|
-
|
|
345
|
-
```typescript
|
|
346
|
-
// prisma.config.ts
|
|
347
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
348
|
-
// Prisma v7 설정 파일
|
|
349
|
-
// Multi-File 스키마 및 마이그레이션 설정
|
|
350
|
-
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
351
|
-
import 'dotenv/config'
|
|
352
|
-
import path from 'node:path'
|
|
353
|
-
import { defineConfig, env } from 'prisma/config'
|
|
354
|
-
|
|
355
|
-
export default defineConfig({
|
|
356
|
-
// Multi-File 스키마 폴더
|
|
357
|
-
schema: path.join('prisma', 'schema'),
|
|
358
|
-
|
|
359
|
-
// 마이그레이션 설정
|
|
360
|
-
migrations: {
|
|
361
|
-
path: 'prisma/migrations',
|
|
362
|
-
seed: 'tsx prisma/seed.ts',
|
|
363
|
-
},
|
|
364
|
-
|
|
365
|
-
// 데이터베이스 연결
|
|
366
|
-
datasource: {
|
|
367
|
-
url: env('DATABASE_URL'),
|
|
368
|
-
},
|
|
369
|
-
})
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
## 관련 문서
|
|
375
|
-
|
|
376
|
-
- [스키마 정의 (Multi-File)](./schema.md)
|
|
377
|
-
- [설치 및 설정](./setup.md)
|
|
@@ -1,218 +1,90 @@
|
|
|
1
1
|
# Prisma - CRUD 작업
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Create (생성)
|
|
6
|
-
|
|
7
|
-
### 단일 레코드 생성
|
|
3
|
+
## Create
|
|
8
4
|
|
|
9
5
|
```typescript
|
|
6
|
+
// 단일
|
|
10
7
|
const user = await prisma.user.create({
|
|
11
|
-
data: {
|
|
12
|
-
email: 'alice@prisma.io',
|
|
13
|
-
name: 'Alice',
|
|
14
|
-
},
|
|
8
|
+
data: { email: 'alice@prisma.io', name: 'Alice' },
|
|
15
9
|
})
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### 관계 포함 생성
|
|
19
10
|
|
|
20
|
-
|
|
21
|
-
const
|
|
11
|
+
// 관계 포함
|
|
12
|
+
const user = await prisma.user.create({
|
|
22
13
|
data: {
|
|
23
14
|
email: 'bob@prisma.io',
|
|
24
|
-
|
|
25
|
-
posts: {
|
|
26
|
-
create: [
|
|
27
|
-
{ title: 'Hello World' },
|
|
28
|
-
{ title: 'My Second Post' },
|
|
29
|
-
],
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
include: {
|
|
33
|
-
posts: true,
|
|
15
|
+
posts: { create: [{ title: 'Hello' }, { title: 'World' }] },
|
|
34
16
|
},
|
|
17
|
+
include: { posts: true },
|
|
35
18
|
})
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
### connectOrCreate로 깊은 중첩 생성
|
|
39
19
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
categories: true,
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
data: {
|
|
50
|
-
email: 'emma@prisma.io',
|
|
51
|
-
posts: {
|
|
52
|
-
create: [
|
|
53
|
-
{
|
|
54
|
-
title: 'My first post',
|
|
55
|
-
categories: {
|
|
56
|
-
connectOrCreate: [
|
|
57
|
-
{
|
|
58
|
-
create: { name: 'Introductions' },
|
|
59
|
-
where: { name: 'Introductions' },
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
create: { name: 'Social' },
|
|
63
|
-
where: { name: 'Social' },
|
|
64
|
-
},
|
|
65
|
-
],
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
})
|
|
20
|
+
// connectOrCreate
|
|
21
|
+
posts: { create: [{
|
|
22
|
+
title: 'Post',
|
|
23
|
+
categories: { connectOrCreate: [{ create: { name: 'Tech' }, where: { name: 'Tech' } }] },
|
|
24
|
+
}]}
|
|
72
25
|
```
|
|
73
26
|
|
|
74
|
-
## Read
|
|
75
|
-
|
|
76
|
-
### 단일 레코드 조회
|
|
27
|
+
## Read
|
|
77
28
|
|
|
78
29
|
```typescript
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
})
|
|
82
|
-
```
|
|
30
|
+
// 단일
|
|
31
|
+
const user = await prisma.user.findUnique({ where: { email } })
|
|
83
32
|
|
|
84
|
-
|
|
33
|
+
// 다중
|
|
34
|
+
const users = await prisma.user.findMany({ where: { name: 'Alice' } })
|
|
85
35
|
|
|
86
|
-
|
|
87
|
-
const users = await prisma.user.findMany({
|
|
88
|
-
where: { name: 'Alice' },
|
|
89
|
-
})
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### 관계 포함 조회
|
|
36
|
+
// 관계 포함
|
|
37
|
+
const users = await prisma.user.findMany({ where: { role: 'ADMIN' }, include: { posts: true } })
|
|
93
38
|
|
|
94
|
-
|
|
95
|
-
const users = await prisma.user.findMany({
|
|
96
|
-
where: { role: 'ADMIN' },
|
|
97
|
-
include: { posts: true },
|
|
98
|
-
})
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 특정 필드만 선택
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
39
|
+
// 필드 선택
|
|
104
40
|
const user = await prisma.user.findUnique({
|
|
105
|
-
where: { email
|
|
106
|
-
select: {
|
|
107
|
-
email: true,
|
|
108
|
-
posts: {
|
|
109
|
-
select: { likes: true },
|
|
110
|
-
},
|
|
111
|
-
},
|
|
41
|
+
where: { email },
|
|
42
|
+
select: { email: true, posts: { select: { title: true } } },
|
|
112
43
|
})
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### 관계 필드로 필터링
|
|
116
44
|
|
|
117
|
-
|
|
45
|
+
// 관계로 필터
|
|
118
46
|
const users = await prisma.user.findMany({
|
|
119
|
-
where: {
|
|
120
|
-
email: { endsWith: 'prisma.io' },
|
|
121
|
-
posts: {
|
|
122
|
-
some: { published: false },
|
|
123
|
-
},
|
|
124
|
-
},
|
|
47
|
+
where: { posts: { some: { published: false } } },
|
|
125
48
|
})
|
|
126
49
|
```
|
|
127
50
|
|
|
128
|
-
## Update
|
|
129
|
-
|
|
130
|
-
### 단일 레코드 수정
|
|
51
|
+
## Update
|
|
131
52
|
|
|
132
53
|
```typescript
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
data: { name: 'Alice Updated' },
|
|
136
|
-
})
|
|
137
|
-
```
|
|
54
|
+
// 단일
|
|
55
|
+
const user = await prisma.user.update({ where: { id }, data: { name: 'Updated' } })
|
|
138
56
|
|
|
139
|
-
|
|
57
|
+
// 다중
|
|
58
|
+
await prisma.user.updateMany({ where: { role: 'USER' }, data: { role: 'ADMIN' } })
|
|
140
59
|
|
|
141
|
-
|
|
142
|
-
const updatedUsers = await prisma.user.updateMany({
|
|
143
|
-
where: { role: 'USER' },
|
|
144
|
-
data: { role: 'ADMIN' },
|
|
145
|
-
})
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### Upsert (있으면 수정, 없으면 생성)
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
60
|
+
// Upsert
|
|
151
61
|
const user = await prisma.user.upsert({
|
|
152
|
-
where: { email
|
|
153
|
-
update: { name: '
|
|
154
|
-
create: { email
|
|
62
|
+
where: { email },
|
|
63
|
+
update: { name: 'Updated' },
|
|
64
|
+
create: { email, name: 'New' },
|
|
155
65
|
})
|
|
156
66
|
```
|
|
157
67
|
|
|
158
|
-
## Delete
|
|
159
|
-
|
|
160
|
-
### 단일 레코드 삭제
|
|
68
|
+
## Delete
|
|
161
69
|
|
|
162
70
|
```typescript
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
})
|
|
71
|
+
await prisma.user.delete({ where: { id } })
|
|
72
|
+
await prisma.user.deleteMany({}) // 전체
|
|
73
|
+
await prisma.post.deleteMany({ where: { published: false } }) // 조건부
|
|
166
74
|
```
|
|
167
75
|
|
|
168
|
-
|
|
76
|
+
## 필터 연산자
|
|
169
77
|
|
|
170
78
|
```typescript
|
|
171
|
-
|
|
172
|
-
|
|
79
|
+
// 문자열
|
|
80
|
+
{ contains: 'prisma', startsWith: 'A', endsWith: 'io' }
|
|
173
81
|
|
|
174
|
-
|
|
82
|
+
// 숫자
|
|
83
|
+
{ gt: 18, gte: 18, lt: 65, lte: 65 }
|
|
175
84
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
where: { published: false },
|
|
179
|
-
})
|
|
180
|
-
```
|
|
85
|
+
// 배열
|
|
86
|
+
{ in: [1, 2, 3], notIn: [4, 5] }
|
|
181
87
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
```typescript
|
|
185
|
-
// 문자열 필터
|
|
186
|
-
where: {
|
|
187
|
-
email: { contains: 'prisma' },
|
|
188
|
-
name: { startsWith: 'A' },
|
|
189
|
-
title: { endsWith: 'guide' },
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// 숫자 필터
|
|
193
|
-
where: {
|
|
194
|
-
age: { gt: 18 }, // greater than
|
|
195
|
-
age: { gte: 18 }, // greater than or equal
|
|
196
|
-
age: { lt: 65 }, // less than
|
|
197
|
-
age: { lte: 65 }, // less than or equal
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// 배열 필터
|
|
201
|
-
where: {
|
|
202
|
-
id: { in: [1, 2, 3] },
|
|
203
|
-
id: { notIn: [4, 5, 6] },
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// 논리 연산자
|
|
207
|
-
where: {
|
|
208
|
-
OR: [
|
|
209
|
-
{ email: { contains: 'prisma' } },
|
|
210
|
-
{ name: { contains: 'Prisma' } },
|
|
211
|
-
],
|
|
212
|
-
AND: [
|
|
213
|
-
{ published: true },
|
|
214
|
-
{ authorId: 1 },
|
|
215
|
-
],
|
|
216
|
-
NOT: { email: { contains: 'test' } },
|
|
217
|
-
}
|
|
88
|
+
// 논리
|
|
89
|
+
{ OR: [...], AND: [...], NOT: {...} }
|
|
218
90
|
```
|