Skip to content

Commit c9c5d86

Browse files
committed
docs: update docs
1 parent 30f1742 commit c9c5d86

File tree

23 files changed

+426
-25
lines changed

23 files changed

+426
-25
lines changed

.vscode/settings.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
{
22
"material-icon-theme.folders.associations": {
33
"database": "",
4+
"debugging": "",
45

56
"__base__": "base",
6-
"__performance__": "benchmark"
7+
"__performance__": "benchmark",
8+
"docker-compose": "docker",
79
}
810
}

docs/.vitepress/config/default-theme-config/default-theme-sidebar/web-frontend/_react.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ export const REACT_JS_SIDEBAR: Array<DefaultTheme.SidebarItem> = [
5252
text: "设计规范",
5353
link: `${REACT_JS_ROOT}/__advanced__/design-patterns`,
5454
},
55+
{
56+
text: "表单处理",
57+
link: `${REACT_JS_ROOT}/__advanced__/form-handlering`,
58+
},
5559
],
5660
},
5761

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
prev: false
3+
next: false
4+
---
5+
6+
# Keycloak
7+
8+
![](/static/skill-images/web-backend--keycloak.png)
9+
10+
## 相关链接
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
prev: false
3+
next: false
4+
---
5+
6+
# SpiceDB
7+
8+
![](/static/skill-images/web-backend--spicedb.png)
9+
10+
## 相关链接
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
---
2+
prev: false
3+
next: false
4+
---
5+
6+
# Prisma
7+
8+
![](/static/skill-images/database--prisma.png)
9+
10+
Prisma 是一个数据库 ORM 工具,可在 Node.js 环境中通过 TypeScript 实现对数据库的管理
11+
12+
## 下载安装
13+
14+
```zsh
15+
# 0. 下载 Prisma 依赖
16+
% npm install -D prisma
17+
% npm install @prisma/client
18+
19+
# 1. 初始化 Prisma
20+
% npx prisma init
21+
```
22+
23+
## 模型 ( Schema )
24+
25+
Prisma Schema 用于定义数据结构
26+
27+
执行`npx prisma init`之后会初始化自动生成定义模型的配置文件`schema.prisma`
28+
29+
该文件默认创建到`项目根路径/prisma/schema.prisma`
30+
31+
---
32+
33+
### 基础语法
34+
35+
```prisma
36+
// 配置数据库连接
37+
datasource db {
38+
provider = "数据库类型"
39+
url = "数据库连接字符串"
40+
}
41+
42+
// 配置 Prisma Client
43+
generator client {
44+
provider = "客户端的生成器类型"
45+
output = "客户端的输出路径"
46+
}
47+
48+
// 自定义数据库中的表结构
49+
model 自定义模型 {
50+
字段 类型 @属性
51+
字段 类型 @属性 @属性
52+
字段 类型 @属性 @map("该字段在数据库中的自定义名称")
53+
54+
@@map("在数据库中的自定义表名称")
55+
}
56+
57+
// 自定义数据库中的枚举
58+
enum 自定义枚举 {
59+
枚举1
60+
枚举2
61+
}
62+
```
63+
64+
::: details 例子:
65+
66+
```prisma
67+
datasource db {
68+
provider = "postgresql"
69+
url = env("DATABASE_URL")
70+
}
71+
72+
generator client {
73+
provider = "prisma-client-js"
74+
output = "../src/generated/prisma"
75+
}
76+
77+
model User {
78+
id Int @id @default(autoincrement())
79+
name String?
80+
email String @unique
81+
password String @default(crypt(generatePassword(), '$2a$10$'))
82+
createdAt DateTime @default(now())
83+
updatedAt DateTime @updatedAt
84+
stories Story[] // User 模型关联到 Story 模型 ( 一对多 )
85+
}
86+
87+
model Story {
88+
id String @id @default(uuid())
89+
published Boolean @default(false)
90+
authorId Int
91+
author User @relation(fields: [authorId], references: [id]) // 当前 Story 模型通过自身 authorId 关联到 User 模型的 id
92+
}
93+
```
94+
95+
:::
96+
97+
---
98+
99+
### 数据迁移与映射
100+
101+
```zsh
102+
# 在开发环境中根据 schema 模型生成迁移文件,并自动更新 Client 与数据库
103+
% npx prisma migrate dev
104+
% npx prisma migrate dev --name [自定义迁移文件名称]
105+
106+
# 在生产环境中执行已经存在的迁移文件
107+
% npx prisma migrate deploy
108+
109+
# 仅将 schema 模型映射到数据库,但是不生成迁移文件也不更新 Client
110+
% npx prisma db push
111+
112+
# 基于当前数据库结构反向生成 schema 模型
113+
% npx prisma db pull
114+
115+
# 重置数据库 ( 会删除所有数据 ) 不建议用在开发环境以外
116+
% npx prisma migrate reset
117+
```
118+
119+
> [!IMPORTANT] <code>db push</code>vs<code>migrate dev</code>
120+
>
121+
> - `npx prisma migrate dev`: 基于变更后的 schema 创建迁移文件后映射到数据库
122+
> - `npx prisma db push`: 不创建迁移文件而是直接将 schema 映射到数据库<br/>慎用,且不应用于生产环境
123+
124+
## 客户端 ( Prisma Client )
125+
126+
Prisma Client 用于处理数据库交互 ( CRUD )
127+
128+
执行`npx prisma generate`之后会基于 schema 生成客户端 ( 包含数据库访问 API、TS 类型 )
129+
130+
可在`schema.prisma`中配置客户端的输出路径 ( 不建议将该目录提交到生成环境 )
131+
132+
schema 模型变更时必须执行`npx prisma generate`更新客户端使其与数据库保持一致
133+
134+
```zsh
135+
# 根据 schema 模型更新 Client
136+
% npx prisma generate
137+
```
138+
139+
---
140+
141+
### 单例模式
142+
143+
使用客户端时应创建一个单例模式的实例对象
144+
145+
```ts
146+
import { PrismaClient } from "客户端的输出路径";
147+
148+
declare global {
149+
var prisma: PrismaClient | undefined;
150+
}
151+
152+
const prismaClient = global.prisma || new PrismaClient();
153+
154+
if (process.env.NODE_ENV !== "production") {
155+
global.prisma = prismaClient;
156+
}
157+
158+
export default prismaClient;
159+
```
160+
161+
---
162+
163+
### TS 类型
164+
165+
```ts
166+
import {
167+
PrismaClient,
168+
自定义枚举类型,
169+
type 自定义模型类型,
170+
} from "客户端的输出路径";
171+
```
172+
173+
---
174+
175+
### CRUD 操作
176+
177+
Prisma 对数据库的 CRUD 操作全部通过上文创建的单例模式的客户端实例对象实现
178+
179+
```ts
180+
import prismaClient from "单例模式的实例对象"
181+
182+
async function getList() {
183+
const result = await prismaClient.note.findMany({
184+
where: { [字段]: 值 },
185+
select: { [字段]: 布尔值 },
186+
orderBy: { [字段]: "desc" },
187+
skip: 整数, // 从第几个数据开始查询
188+
take: 整数, // 查询多少个数据
189+
});
190+
return result
191+
}
192+
193+
async function getOne() {
194+
const result = await prismaClient.[模型].findUnique({
195+
where: { [字段]: 值 },
196+
});
197+
if (!result) throw new Error("Not Found")
198+
return result
199+
}
200+
201+
async function create() {
202+
const result = await prismaClient.[模型].create({
203+
data: { [字段]: 值 },
204+
})
205+
return result
206+
}
207+
208+
async function update() {
209+
const result = await prismaClient.[模型].update({
210+
where: { [字段]: 值 },
211+
data: { [字段]: 值 },
212+
})
213+
return result
214+
}
215+
216+
async function delete() {
217+
const result = await prismaClient.[模型].delete({
218+
where: { [字段]: 值 },
219+
})
220+
return result
221+
}
222+
```
223+
224+
## 图形用户界面 ( Prisma Studio )
225+
226+
Prisma Studio 可在浏览器中直接查看和管理数据库
227+
228+
```zsh
229+
% npx prisma studio \
230+
--hostname 0.0.0.0 \
231+
--port [端口号] \
232+
--browser none
233+
```
234+
235+
## 相关链接
236+
237+
- [Prisma 官网](https://www.prisma.io/)
238+
- [Prisma 教程](https://www.bilibili.com/video/BV1da4y1g7ee?spm_id_from=333.788.player.player_end_recommend_autoplay&vd_source=8960252a3845b76b699282b11f36ab5c)
239+
- [Prisma + Supabase](https://zenn.dev/kiriyama/articles/89bac9034bbe7a#3%3Aprisma%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9A)

docs/notes/web-backend/frameworks/django-rest-framework/__base__/serializer.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> Serializer
44
5-
DRF 序列化器用于处理 Django 模型实例与 JSON 格式数据的相互转换,比原生 Django 更简洁
5+
可用于处理 Django 模型实例与数据的序列化转换、字段验证 ( 比原生 Django 更简洁 )
66

77
建议以模块化的形式组织定义在自定义应用目录下
88

docs/notes/web-backend/frameworks/django-rest-framework/__base__/viewset.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> ViewSet
44
5-
DRF 的视图集可快速实现请求响应处理以及数据的 CRUD 操作比原生 Django 的视图更简洁
5+
可快速实现请求响应处理、数据的 CRUD 操作 ( 比原生 Django 的视图更简洁 )
66

77
建议定义在自定义应用目录下替代原生 Django 的视图
88

docs/notes/web-backend/frameworks/django/__base__/mtv/model.md

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -430,26 +430,47 @@ Django 模型需要通过命令迁移后才能映射到数据库中
430430
# 应用最新的迁移文件的内容
431431
(虚拟环境) % python manage.py migrate
432432

433-
# 实现回滚至某指定迁移文件的内容
434-
(虚拟环境) % python manage.py migrate [迁移文件名].py
433+
# 应用某指定迁移文件的内容
434+
(虚拟环境) % python manage.py migrate [自定义应用名]
435+
(虚拟环境) % python manage.py migrate [自定义应用名] [迁移文件名]
435436
```
436437

437438
---
438439

440+
### 迁移回滚
441+
442+
```zsh [迁移回滚]
443+
# 回滚至指定迁移文件
444+
(虚拟环境) % python manage.py migrate [自定义应用名] [迁移文件名]
445+
446+
# 回滚至应用的初始状态 ( 完全移除已经迁移的所有内容 )
447+
(虚拟环境) % python manage.py migrate [自定义应用名] zero
448+
```
449+
450+
> [!CAUTION] 迁移文件冲突的解决方法
451+
>
452+
> 1. 回滚至指定迁移文件或应用的初始状态
453+
> 2. 删除`migrations`目录下的指定或所有文件 ( 保留`__init__.py`文件 )
454+
> 3. 删除数据库中对应的迁移表或重建数据库
455+
> 4. 重新重新生成迁移文件
456+
> 5. 重新应用上述迁移文件
457+
458+
---
459+
439460
### 数据的导入导出
440461

441462
::: code-group
442463

443464
```zsh [数据导出]
444465
# 导出全部的数据
445-
(虚拟环境) % python manage.py dumpdata --output=[文件.后缀]
466+
(虚拟环境) % python manage.py dumpdata --output=[文件名.后缀]
446467

447468
# 仅导出指定的自定义应用中某模型映射的数据
448-
(虚拟环境) % python manage.py dumpdata [自定义应用.模型] --output=[文件.后缀]
469+
(虚拟环境) % python manage.py dumpdata [自定义应用.模型] --output=[文件名.后缀]
449470
```
450471

451472
```zsh [数据导入]
452-
(虚拟环境) % python manage.py loaddata [文件.后缀]
473+
(虚拟环境) % python manage.py loaddata [文件名.后缀]
453474

454475
```
455476

0 commit comments

Comments
 (0)