Files
AIclinicalresearch/docs/05-部署文档/PostgreSQL部署策略-摸底报告.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

1123 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PostgreSQL 15 <20>唳旿摨㯄<E691A8>蝵脩<E89DB5><E884A9>?- <20><EFBFBD><E8A9A8><EFBFBD>
> **<2A><><EFBFBD><EFB99D>𧋦嚗?* v1.1
> **<2A>𥕦遣<F0A595A6><EFBFBD>嚗?* 2025-12-14
> **<2A><><EFBFBD>擧凒<E693A7><EFBFBD>** 2025-12-14
> **<2A>唳旿摨梶<E691A8><E6A2B6>穿<EFBFBD>** PostgreSQL 15.14 (Docker: postgres:15-alpine)
> **<2A><EFBFBD><E6A0BC><EFBFBD>嚗?* <20><EFBFBD>鈭?RDS PostgreSQL 15
> **<2A><EFBFBD>蝐餃<E89D90>嚗?* <20><><EFBFBD>舀𨰫摨?+ <20>函蔡蝑𣇉裦
---
## <20><> <20><>𧋦靽株恥霈啣<E99C88>
### v1.1 (2025-12-14) - 銝㮖<E98A9D>撱箄悅靽格迤<E6A0BC>?
**靽格迤閬<E8BFA4><E996AC>嚗?*
1. **<EFBFBD>?pg-boss銵?<3F><EFBFBD>"<22><EFBFBD><EFBFBD><E79E89>**
- 靽格迤嚗䮝g-boss隡𡁜銁摨𠉛鍂<F0A0899B>臬𢆡<E887AC>嗉䌊<E59789><EFBFBD>撱箄”嚗<E2809D>蘨閬<E898A8><E996AC><EFBFBD>𣂼<EFBFBD>
- <20><EFBFBD>銝仿<E98A9D><E4BBBF><EFBFBD>隞?銝仿<E98A9D>撌桀<E6928C><E6A180>?<3F>嫣蛹"<22><EFBFBD><E88AA3><EFBFBD><E7AE8F><EFBFBD><EFBFBD><EFBFBD>𣳇<EFBFBD><F0A3B387><EFBFBD><EFBFBD>嚗?
- 憓𧼮<E68693>霂湔<E99C82>嚗䮝g-boss<73><73><EFBFBD>質䌊<E8B3AA><E48C8A><EFBFBD><EFBFBD>𥕦<EFBFBD><F0A595A6><EFBFBD><EFBFBD><EFBFBD><E996AC>
2. **<EFBFBD>?<3F><EFBFBD><E8B3A2><EFBFBD>蝵桀撩<E6A180>𤥁秩<F0A4A581>?*
- <20><EFBFBD>嚗𡁜<E59A97>憿颱蝙<E9A2B1>汲PC蝵烐挾嚗䔶<E59A97><E494B6>賜鍂<E8B39C>閙㦤IP
- 蝷箔<E89DB7>嚗?72.16.0.0/12嚗𠄎AE<41><45>PC蝵烐挾嚗? - <20><EFBFBD>嚗锭AE摰硺<E691B0>IP隡𡁜<E99AA1><F0A1819C><EFBFBD><E59094>閙㦤IP隡𡁜紡<F0A1819C><EFBFBD><E6B8B2>亙仃韐? - 雿滨蔭嚗鑹DS<44><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝏𨅯<E89D8F><F0A885AF><EFBFBD><E585B7><EFBFBD><EFBFBD>甇亥<E79487><E4BAA5><EFBFBD><EFBFBD>撩靚?
3. **<EFBFBD>?憭<>遢蝑𣇉裦蝞<E8A3A6><E89D9E><EFBFBD><E59094>游𦛚摰痹<E691B0>**
- 靽格迤嚗𡁜<E59A97><F0A1819C>笔蘨<E7AC94><E898A8>RDS<44>芸𢆡憭<F0A286A1>遢嚗<E981A2><EFBFBD><EFBFBD><EFBFBD>遢嚗? - <20>滨漣嚗䮝g_dump ECS<43>𡁏𧋦隞?蝚砌<E89D9A><E7A08C>㯄俈蝥?<3F>滢蛹"<22><EFBFBD><EFBFBD>銝𡁜𦛚<F0A1819C>𡁜之<F0A1819C>𤾸<EFBFBD><F0A4BEB8><EFBFBD><EFBFBD>嚗?
- <20><>眏嚗鑹DS<44>芸𢆡憭<F0A286A1>遢+PITR撌脰雲憭<E99BB2><E686AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- 靽萘<E99DBD>嚗朞<E59A97><E69C9E>祉內靘衤<E99D98>銝箏<E98A9D><E7AE8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>釣"<22>𩤃<EFBFBD><><E99A9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝漤<E98A9D>閬?
**韐∠讃<E288A0><E8AE83><EFBFBD>** 憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD>臬𣪧<E887AC><EFBFBD>擐?
---
---
## <20><> <20><EFBFBD>
1. [<5B>砍𧑐<E7A08D>唳旿摨梶<E691A8>摰墧<E691B0><E5A2A7>琶(#<23>砍𧑐<E7A08D>唳旿摨梶<E691A8>摰墧<E691B0><E5A2A7>?
2. [Prisma銝擧㺭<E693A7><EFBFBD><E6A180><EFBFBD>榆撘<E6A686><E69298><EFBFBD>𨚼(#prisma銝擧㺭<EFBFBD><EFBFBD><EFBFBD><EFBFBD>榆撘<EFBFBD><EFBFBD><EFBFBD>?
3. [隞<><E99A9E><EFBFBD><E68692>餈墧𦻖<E5A2A7>唳旿摨𨩇(#隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈墧𦻖<EFBFBD>唳旿摨?
4. [擐𡝗活<EFBFBD>函蔡<EFBFBD><EFBFBD>](#擐𡝗活<F0A19D97>函蔡<E587BD><EFBFBD>)
5. [<EFBFBD>芣䔉<EFBFBD>湔鰵蝑𣇉裦](#<23>芣䔉<E88AA3>湔鰵蝑𣇉裦)
6. [RDS憭<EFBFBD>遢蝑𣇉裦](#rds憭<73>遢蝑𣇉裦)
7. [<EFBFBD><EFBFBD>雿喳<EFBFBD>頝萎<EFBFBD><EFBFBD><EFBFBD><EFBFBD>](#<23><>雿喳<E99BBF>頝萎<E9A09D><EFBFBD><EFBFBD><EFBFBD>)
---
## <20>砍𧑐<E7A08D>唳旿摨梶<E691A8>摰墧<E691B0><E5A2A7>?
### 1. <20><EFBFBD>靽⊥<E99DBD>
```bash
Docker<EFBFBD>𨅯<EFBFBD>嚗䮝ostgres:15-alpine
<EFBFBD>唳旿摨枏<EFBFBD>蝘堆<EFBFBD>ai_clinical_research
餈墧𦻖靽⊥<EFBFBD>嚗䮝ostgresql://postgres:postgres@localhost:5432/ai_clinical_research
<EFBFBD>唳旿摨枏之撠𧶏<EFBFBD>26 MB嚗<42><E59A97>霂?撘<><E69298>𤑳㴓憓<E3B493><E68693>
<EFBFBD><EFBFBD><EFBFBD>唳旿嚗?銝芰鍂<E88AB0>瑁揭<E79181>?```
### 2. Schema<6D>𠉛氖<F0A0899B><EFBFBD>嚗?0銝杵chema嚗争<E59A97>
雿删<EFBFBD><EFBFBD>唳旿摨枏歇蝏𤩺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10銝杵chema<EFBFBD>𠉛氖<EFBFBD><EFBFBD>嚗?
| # | Schema<6D>滨妍 | 銵冽㺭<E586BD>?| <20><EFBFBD>?| 霂湔<E99C82> |
|---|-----------|--------|------|------|
| 1 | `platform_schema` | 8銝芾” | <20>?撌脣<E6928C><E884A3>?| 撟喳蝱<E596B3><EFBFBD>霈暹鴌嚗<E9B48C><EFBFBD><EFBFBD><E791AF>g-boss<73><EFBFBD>嚗?|
| 2 | `aia_schema` | 5銝芾” | <20>?撌脣<E6928C><E884A3>?| AI<41><EFBFBD><E7AE84><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E69FB4>笆霂腈<E99C82><E88588><EFBFBD><EFBFBD><EFBFBD> |
| 3 | `pkb_schema` | 5銝芾” | <20>?撌脣<E6928C><E884A3>?| 銝芯犖<E88AAF><EFBFBD>摨橒<E691A8><E6A992><EFBFBD>摨瓐<E691A8><E79390><EFBFBD><EFBFBD><E78DA2><EFBFBD>鸌憭<E9B88C><E686AD>嚗?|
| 4 | `asl_schema` | 6銝芾” | <20>?撌脣<E6928C><E884A3>?| AI<41><EFBFBD><E7AE84><EFBFBD>讃嚗<E8AE83><E59A97><EFBFBD><EFBFBD><E6A183><EFBFBD> |
| 5 | `dc_schema` | 6銝芾” | <20>?撌脣<E6928C><E884A3>?| <20>唳旿皜<E697BF><E79A9C><EFBFBD><EFBFBD><EFBFBD><E8B8B4><EFBFBD><EFBFBD>碶遙<E7A2B6><EFBFBD><EFBD9E>ool C嚗?|
| 6 | `admin_schema` | 0銝芾” | <20><> 蝛搴chema | 餈鞱𨯫蝞∠<E89D9E><EFBFBD><E59A97><EFBFBD><EFBFBD> |
| 7 | `rvw_schema` | 0銝芾” | <20><> 蝛搴chema | 摰∠阮蝟餌<E89D9F><EFBFBD><E59A97><EFBFBD><EFBFBD> |
| 8 | `ssa_schema` | 0銝芾” | <20><> 蝛搴chema | <20><EFBFBD>蝏蠘恣<E8A098><E681A3><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD> |
| 9 | `st_schema` | 0銝芾” | <20><> 蝛搴chema | 蝏蠘恣<E8A098><E681A3><EFBFBD>撌亙<E6928C><EFBFBD><E59A97><EFBFBD><EFBFBD> |
| 10 | `common_schema` | 0銝芾” | <20><> 蝛搴chema | <20>𡁶鍂<F0A181B6><EFBFBD><EFBFBD><E69285><EFBFBD><E686B8>嚗?|
| 11 | `public` | 4銝芾” | <20>𩤃<EFBFBD> <20>扯”<E689AF><EFBFBD> | _prisma_migrations, admin_logs, review_tasks, users |
**<2A>餉恣嚗?4銝芾”嚗?0銝芸銁<E88AB8>𠉛氖Schema銝哨<E98A9D>4銝芸銁public銝哨<E98A9D>**
### 3. 霂衣<E99C82>銵冽<E98AB5><E586BD>?
#### 3.1 platform_schema嚗?銝芾”嚗?
```
<EFBFBD>?users - <20><EFBFBD>銵剁<E98AB5>3<EFBFBD>∟扇敶𤏪<E695B6>
<EFBFBD>?app_cache - Postgres-Only蝻枏<E89DBB><EFBFBD>𤜯隞Οedis嚗?<3F>?job - pg-boss隞餃𦛚銵?<3F>?job_common - pg-boss隞餃𦛚<E9A483>𡁶鍂銵?<3F>?queue - pg-boss<73><EFBFBD>銵?<3F>?schedule - pg-boss摰𡁏𧒄隞餃𦛚銵?<3F>?subscription - pg-boss霈<E99C88>銵?<3F>?version - pg-boss<73><73>𧋦銵?```
**<2A>𩤃<EFBFBD> <20><EFBFBD><E6BBA9>𤑳緵嚗䮝g-boss<73>?銝芾”嚗àob/queue蝑㚁<E89D91><E39A81>航䌊<E888AA><EFBFBD>撱箇<E692B1>嚗䔶<E59A97><E494B6>沌risma Schema銝哨<E98A9D>**
#### 3.2 aia_schema嚗?銝芾”嚗?
```
<EFBFBD>?projects - 憿寧𤌍蝞∠<E89D9E>嚗?<3F>∟扇敶𤏪<E695B6>
<EFBFBD>?conversations - 憿寧𤌍撖寡<E69296>
<EFBFBD>?messages - 撖寡<E69296><EFBFBD><E798A8>
<EFBFBD>?general_conversations - <20>𡁶鍂撖寡<E69296>
<EFBFBD>?general_messages - <20>𡁶鍂瘨<E98D82><E798A8>
```
#### 3.3 pkb_schema嚗?銝芾”嚗?
```
<EFBFBD>?knowledge_bases - <20><EFBFBD>摨橒<E691A8>2<EFBFBD>∟扇敶𤏪<E695B6>
<EFBFBD>?documents - <20><>
<EFBFBD>?batch_tasks - <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD>?<3F>?batch_results - <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>976 KB嚗?<3F>?task_templates - 隞餃𦛚璅⊥踎
```
#### 3.4 asl_schema嚗?銝芾”嚗?
```
<EFBFBD>?screening_projects - <20><>讃蝑偦<E89D91>厰★<E58EB0><EFBFBD>18<31>∟扇敶𤏪<E695B6>
<EFBFBD>?literatures - <20><><EFBFBD>唳旿嚗?.9 MB嚗?<3F>?screening_results - 蝑偦<E89D91><EFBFBD><E58EA9><EFBFBD>1.2 MB嚗?<3F>?screening_tasks - 蝑偦<E89D91>劐遙<E58A90>?<3F>?fulltext_screening_tasks - <20><EFBFBD>蝑偦<E89D91>劐遙<E58A90>?<3F>?fulltext_screening_results - <20><EFBFBD>蝑偦<E89D91><EFBFBD><E58EA9>?```
#### 3.5 dc_schema嚗?銝芾”嚗?
```
<EFBFBD>?dc_health_checks - <20>亙熒璉<E78692><E79289>?<3F>?dc_templates - <20>唳旿皜<E697BF><E79A9C>璅⊥踎嚗?<3F>∟扇敶𤏪<E695B6>424 KB嚗?<3F>?dc_extraction_tasks - <20>𣂼<EFBFBD>隞餃𦛚嚗?28 KB嚗?<3F>?dc_extraction_items - <20>𣂼<EFBFBD>憿對<E686BF>6.5 MB嚗峕<E59A97>憭扯”嚗?<3F>?dc_tool_c_sessions - Tool C隡朞<E99AA1>嚗?60 KB嚗?<3F>?dc_tool_c_ai_history - Tool C AI<41><49>蟮嚗? MB嚗?```
#### 3.6 public schema嚗?銝芾”嚗争<E59A97>儭?
```
<EFBFBD>𩤃<EFBFBD> _prisma_migrations - Prisma餈<61>宏霈啣<E99C88>嚗?<3F>∟扇敶𤏪<E695B6>
<EFBFBD>𩤃<EFBFBD> admin_logs - 蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>
<EFBFBD>𩤃<EFBFBD> review_tasks - 摰⊥䰻隞餃𦛚嚗?32 KB嚗屸<E59A97><E5B1B8><EFBFBD>
<EFBFBD>𩤃<EFBFBD> users - <20><EFBFBD>銵剁<E98AB5><E58981><EFBFBD>嚗䔶<E59A97>platform_schema.users<72><EFBFBD>嚗?```
**霂湔<E99C82>嚗?*
- `public.users` <20>特chema餈<61><EFBFBD><EFBFBD><E6BBA8>扯”嚗䔶<E59A97> `platform_schema.users` 蝏𤘪<E89D8F><EFBFBD><E691B0><EFBFBD><EFBFBD>
- `admin_logs` <20>?`review_tasks` 摨磰砲餈<E7A0B2><EFBFBD>?`admin_schema` <20>?`rvw_schema`
- `_prisma_migrations` 摨磰砲靽萘<E99DBD><E89098>?`public`嚗諹<E59A97><E8ABB9>烈risma<6D><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵?
### 4. <20>唳旿<E594B3><EFBFBD>霈∴<E99C88>Top 15憭扯”嚗?
| Schema | 銵典<E98AB5> | 憭批<E686AD> | 霂湔<E99C82> |
|--------|------|------|------|
| dc_schema | dc_extraction_items | 6.5 MB | <20>唳旿皜<E697BF><E79A9C><EFBFBD>𣂼<EFBFBD>憿對<E686BF><E5B08D><EFBFBD>憭扯”嚗?|
| asl_schema | literatures | 2.9 MB | <20><><EFBFBD>唳旿 |
| asl_schema | screening_results | 1.2 MB | 蝑偦<E89D91><EFBFBD><E58EA9>?|
| dc_schema | dc_tool_c_ai_history | 1 MB | Tool C AI<41><49>蟮 |
| pkb_schema | batch_results | 976 KB | <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD>?|
| dc_schema | dc_tool_c_sessions | 960 KB | Tool C隡朞<E99AA1> |
| dc_schema | dc_extraction_tasks | 728 KB | <20>𣂼<EFBFBD>隞餃𦛚 |
| public | review_tasks | 632 KB | 摰⊥䰻隞餃𦛚嚗<F0A69B9A><E59A97><EFBFBD><EFBFBD> |
| dc_schema | dc_templates | 424 KB | <20>唳旿皜<E697BF><E79A9C>璅⊥踎 |
| pkb_schema | documents | 296 KB | <20><>﹝ |
| aia_schema | general_messages | 208 KB | <20>𡁶鍂瘨<E98D82><E798A8> |
| asl_schema | screening_projects | 144 KB | 蝑偦<E89D91>厰★<E58EB0>?|
| aia_schema | conversations | 112 KB | 撖寡<E69296> |
| pkb_schema | batch_tasks | 112 KB | <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD>?|
| aia_schema | messages | 104 KB | 瘨<><E798A8> |
**<2A><EFBFBD>嚗𡁏㺭<F0A1818F>桐蜓閬<E89C93><E996AC>銝剖銁 DC嚗<43><EFBFBD><EFBFBD>瘣梹<E798A3><E6A2B9>?ASL嚗<4C><E59A97><EFBFBD><EFBFBD><E6A183><EFBFBD><E79285><E288AA>?*
### 5. Prisma餈<61><EFBFBD><E5AE8F>
```sql
-- 6甈·risma餈<61>宏霈啣<E99C88><EFBFBD><E59A97><EFBFBD>園𡢿憿箏<E686BF>嚗?20251010075003_init -- 2025-10-12嚗<32><E59A97>憪见<E686AA>嚗?20251010122727_add_conversation_metadata -- 2025-10-12嚗<32>笆霂嘥<E99C82><E598A5>唳旿嚗?20251012124747_add_batch_processing_module -- 2025-10-12嚗<32>鸌憭<E9B88C><E686AD><E79285>嚗?20251014120128_add_review_tasks -- 2025-10-14嚗<34><EFBFBD>乩遙<E4B9A9><EFBFBD>
20251127_add_dc_tool_b_tables -- 2025-11-27嚗㇄C Tool B嚗?20251208_add_column_mapping -- 2025-12-08嚗<38><E59A97><EFBFBD><EFBFBD>嚗?```
**霂湔<E99C82>嚗?*
- <20><><EFBFBD><EFBFBD><EFBFBD>宏嚗ǎnit嚗匧<E59A97>撱箇<E692B1><E7AE87>?`public` schema 銝剔<E98A9D>銵?- <20>𡒊賒<F0A1928A><EFBFBD><E69C9E>见極SQL餈<4C><EFBFBD><EFBFBD>10銝芷<E98A9D>蝳艋chema
- Prisma撟嗆瓷<E59786>㕑扇敶笌chema餈<61>宏餈<E5AE8F><E9A488><EFBFBD><E59A97>鈭𥟇糓<F0A59F87>见極SQL摰峕<E691B0><E5B395><EFBFBD><EFBFBD>
---
## Prisma銝擧㺭<E693A7><EFBFBD><E6A180><EFBFBD>榆撘<E6A686><E69298><EFBFBD>?
### 1. pg-boss銵函<E98AB5>"<22><EFBFBD>"<22><EFBFBD><E7AE8F><EFBFBD><EFBFBD><EFBFBD>𣳇<EFBFBD><F0A3B387><EFBFBD><EFBFBD>嚗?
**<2A>啗情嚗?*
`platform_schema` <20>?8 銝芾”嚗䔶<E59A97> Prisma Schema <20><EFBFBD>銋劐<E98A8B> 2 銝迎<E98A9D>
- <20>?Prisma摰帋<E691B0>嚗䫤AppCache`, `User`
- <20>圲 pg-boss<73>芸𢆡蝞∠<E89D9E>嚗䫤job`, `job_common`, `queue`, `schedule`, `subscription`, `version`嚗<><E59A97>6銝芾”嚗?
**<2A><EFBFBD>嚗?*
餈?銝芾”<E88ABE>?`pg-boss` 摨枏銁**摨𠉛鍂<F0A0899B>臬𢆡<E887AC>嗉䌊<E59789><EFBFBD>撱?*<2A><><EFBFBD><EFBFBD><EFBFBD>Postgres-Only隞餃𦛚<E9A483><EFBFBD>嚗㚁<E59A97>銝漤<E98A9D><EFBFBD>銁Prisma Schema銝剖<E98A9D>銋剹<E98A8B>?
**pg-boss<73>?<3F><EFBFBD>"<22><EFBFBD>嚗?*
```typescript
// backend<6E>臬𢆡<E887AC><EFBFBD>pg-boss隡朞䌊<E69C9E><EFBFBD><E586BD>亥”<E4BAA5>臬炏摮睃銁
const boss = new PgBoss(process.env.DATABASE_URL)
await boss.start()
// <20>?憒<><E68692>銵其<E98AB5>摮睃銁嚗俰g-boss隡朞䌊<E69C9E><EFBFBD>撱?// <20>?<3F><EFBFBD><E88ABE>唳旿摨梶鍂<E6A2B6><EFBFBD><EFBFBD>iclinical_rw嚗㗇<E59A97> CREATE TABLE <20><><EFBFBD>
// <20>?摰<><E691B0>銝漤<E98A9D><EFBFBD><E996AC>撌亙僕憸?```
**<EFBFBD><EFBFBD>?*
- <EFBFBD>?**<EFBFBD><EFBFBD><EFBFBD>**g-boss<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Prisma霈輸䔮
- <EFBFBD>?**𡝗<EFBFBD><EFBFBD>𢆡<EFBFBD>𥕦**DS<EFBFBD><EFBFBD><EFBFBD>backend<EFBFBD>𢆡<EFBFBD><EFBFBD><EFBFBD>6
- <EFBFBD>𩤃<EFBFBD> **Prisma db pull隡𡁏<EFBFBD><EFBFBD>**𡁏<EFBFBD>?`npx prisma db pull` <EFBFBD><EFBFBD><EFBFBD>𤑳"<EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?- <EFBFBD>𩤃<EFBFBD> **Prisma migrate銝齿<EFBFBD>?*<EFBFBD><EFBFBD>𡁜<EFBFBD><EFBFBD>𥡝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
```prisma
// backend/prisma/schema.prisma
// <20><EFBFBD>隞嗅<E99A9E>憭湔溶<E6B994>䭾釣<E4ADBE>𠺪<EFBFBD><F0A0BAAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ==================== pg-boss <20>芸𢆡蝞∠<E89D9E><E288A0><EFBFBD>”嚗<E2809D><E59A97><EFBFBD><EFBFBD><EFBFBD><E996AC>銋㚁<E98A8B> ====================
// 隞乩<E99A9E>6銝芾”<E88ABE>徙g-boss摨栞䌊<E6A09E><EFBFBD>撱箏<E692B1>蝏湔擪嚗諹窈<E8ABB9><EFBFBD>撌乩耨<E4B9A9><EFBFBD>
// - platform_schema.job - 隞餃𦛚銵?// - platform_schema.job_common - 隞餃𦛚<E9A483>𡁶鍂<F0A181B6>滨蔭
// - platform_schema.queue - <20><EFBFBD>銵?// - platform_schema.schedule - 摰𡁏𧒄隞餃𦛚銵?// - platform_schema.subscription - 霈<E99C88>銵?// - platform_schema.version - <20><>𧋦銵?// ==================== 隞乩<E99A9E>銵刻䌊<E588BB>函恣<E587BD><E681A3><EFBFBD><EFBFBD>𣳇<EFBFBD>Prisma摰帋<E691B0> ====================
```
**蝏栞捏嚗䮝g-boss銵?蝻箏仃"<22>舀迤撣貊<E692A3>嚗峕<E59A97><E5B395><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
### 2. public schema<6D><EFBFBD>銵兩<E98AB5>儭𧶏<E584AD><F0A7B68F><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>
**<EFBFBD><EFBFBD>嚗?*
`public` schema <20>?4 銝芾”嚗?- `_prisma_migrations`嚗䥪risma<EFBFBD><EFBFBD><EFBFBD>銵剁<EFBFBD><EFBFBD><EFBFBD>?- `users`嚗帋<EFBFBD> `platform_schema.users` <20><EFBFBD><E6BB9A>?- `admin_logs`嚗𡁜<EFBFBD><EFBFBD><EFBFBD>?`admin_schema`<EFBFBD>?- `review_tasks`嚗𡁜<EFBFBD><EFBFBD><EFBFBD>?`rvw_schema`<EFBFBD>?
**敶勗<E695B6>嚗?*
- <20>𩤃<EFBFBD> <20>唳旿銝滢<E98A9D><E6BBA2><EFBFBD><E6B9A7><EFBFBD><EFBFBD><E68692><EFBFBD><E99A9E>霂航粉 `public.users`嚗?- <20>𩤃<EFBFBD> 瘛瑟<E7989B><EFBFBD>舅銝?`users` 銵剁<E98AB5>
- <20>𩤃<EFBFBD> 蝛粹𡢿瘚芾晶嚗<E699B6><E59A97>憭齿㺭<E9BDBF><EFBFBD>
**閫<><E996AB><EFBFBD><EFBFBD>嚗?*
```sql
-- 甇仿炊1嚗朞<E59A97>蝘?admin_logs <20>?admin_schema
ALTER TABLE public.admin_logs SET SCHEMA admin_schema;
-- 甇仿炊2嚗朞<E59A97>蝘?review_tasks <20>?rvw_schema
ALTER TABLE public.review_tasks SET SCHEMA rvw_schema;
-- 甇仿炊3嚗𡁻<E59A97>霂?platform_schema.users <20>?public.users <20>唳旿銝<E697BF><E98A9D><EFBFBD><E6B8B8>𣳇膄
-- 嚗<><E59A97><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><E68693><EFBFBD><E99C82><EFBFBD><EFBFBD>蝖桐<E89D96><EFBFBD><E99A9E>銝滚<E98A9D>撘閧鍂 public.users嚗?DROP TABLE public.users;
```
### 3. Prisma Schema<6D><61><EFBFBD>銋厩𠶖<E58EA9>?
| Schema | Prisma摰帋<E691B0><E5B88B><EFBFBD><EFBFBD>?| 摰鮋<E691B0><E9AE8B>唳旿摨栞” | <20><EFBFBD>?|
|--------|-----------------|-------------|------|
| platform_schema | 2銝迎<E98A9D>AppCache, User嚗?| 8銝迎<E98A9D>+6銝況g-boss<73>芸𢆡蝞∠<E89D9E>嚗?| <20>?甇<>虜嚗īg-boss<73><EFBFBD>嚗?|
| aia_schema | 5銝?| 5銝?| <20>?銝<><E98A9D>?|
| pkb_schema | 5銝?| 5銝?| <20>?銝<><E98A9D>?|
| asl_schema | 6銝?| 6銝?| <20>?銝<><E98A9D>?|
| dc_schema | 6銝?| 6銝?| <20>?銝<><E98A9D>?|
| public | 2銝迎<E98A9D>AdminLog, ReviewTask嚗?| 4銝迎<E98A9D>+_prisma_migrations, users嚗?| <20>𩤃<EFBFBD> <20><><EFBFBD><E79A9C> |
**蝏栞捏嚗?*
- <20>?**Prisma Schema 摰<><E691B0><EFBFBD><EFBFBD>**嚗䮝g-boss<73>?銝芾”隡朞䌊<E69C9E><EFBFBD>撱綽<E692B1>銝漤<E98A9D><EFBFBD><E996AC>銋?- <20>𩤃<EFBFBD> **public schema<6D><61><EFBFBD><E996AC><EFBFBD>?*嚗𡁻<E59A97><F0A181BB><EFBFBD><E59798><EFBFBD> `users` 銵剁<E98AB5>擐𡝗活<F0A19D97>函蔡<E587BD><EFBFBD><E693A7><EFBFBD><EFBFBD>
---
## 隞<><E99A9E><EFBFBD><E68692>餈墧𦻖<E5A2A7>唳旿摨?
### 1. <20><EFBFBD><E887AC><EFBFBD><E3979B>滨蔭
#### 1.1 暺䁅恕餈墧𦻖摮㛖泵銝莎<E98A9D>env.ts嚗?
```typescript
// AIclinicalresearch/backend/src/config/env.ts (line 50)
databaseUrl: process.env.DATABASE_URL || 'postgresql://postgres:postgres@localhost:5432/ai_clinical'
```
**<EFBFBD>𩤃<EFBFBD> 瘜冽<E7989C>嚗?*
- 暺䁅恕<E48185>潭糓 `ai_clinical`<EFBFBD><EFBFBD>摮睃銁嚗?- 摰鮋<E691B0><E9AE8B>唳旿摨枏<E691A8><E69E8F>?`ai_clinical_research`
- 霂湔<E99C82>雿删<E99BBF> `.env` <20><>辣銝剖歇蝏𤩺迤蝖桅<E89D96>蝵桐<E89DB5> `DATABASE_URL`
#### 1.2 餈墧𦻖瘙𣳇<E79899>蝵殷<E89DB5>database.ts嚗?
```typescript
// AIclinicalresearch/backend/src/config/database.ts
export const prisma = new PrismaClient({
datasources: {
db: {
url: process.env.DATABASE_URL, // 隞𡒊㴓憓<E3B493><E68693><EFBFBD>讛粉<E8AE9B>? },
},
})
// 餈墧𦻖瘙㰘恣蝞堒<E89D9E>撘?connectionLimit = Math.floor(RDS_MAX_CONNECTIONS / MAX_INSTANCES) - 10
// 蝷箔<E89DB7>嚗?00 / 20 - 10 = 10銝芾<E98A9D><E88ABE>?摰硺<E691B0>
```
**鈭穃<E988AD><E7A983><EFBFBD><E8A098><EFBFBD>蝑𣇉裦嚗?*
```
DATABASE_URL=postgresql://user:pass@host:5432/db?connection_limit=10&pool_timeout=10
```
### 2. 餈墧𦻖<E5A2A7><EFBFBD>
| 餈墧𦻖<E5A2A7><F0A6BB96>㺭 | <20>砍𧑐撘<F0A79190><E69298>?| <20><EFBFBD>鈭騌AE |
|---------|---------|----------|
| **銝餅㦤** | localhost | RDS<44><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E59A97> rm-xxxxx.pg.rds.aliyuncs.com嚗?|
| **蝡臬藁** | 5432 | 5432 |
| **<EFBFBD>唳旿摨?* | ai_clinical_research | ai_clinical_research嚗<68><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
| **<EFBFBD><EFBFBD><EFBFBD>?* | postgres | <20><EFBFBD>銋㚁<E98A8B>憒?aiclinical_rw嚗?|
| **撖<><E69296>** | postgres | 撘箏<E69298><E7AE8F><EFBFBD><EFBFBD>RDS<44>𥕦遣<F0A595A6>嗉挽蝵殷<E89DB5> |
| **餈墧𦻖<E5A2A7>𣂼<EFBFBD>** | <20>𣳇<EFBFBD><F0A3B387>?| connection_limit=10嚗𠄎AE瘥誩<E798A5>靘页<E99D98> |
| **餈墧𦻖頞<F0A6BB96>𧒄** | 暺䁅恕 | pool_timeout=10 |
### 3. 憭锭chema霈輸䔮嚗㇊risma嚗?
```prisma
// AIclinicalresearch/backend/prisma/schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
schemas = ["platform_schema", "aia_schema", "pkb_schema", "asl_schema",
"common_schema", "dc_schema", "rvw_schema", "admin_schema",
"ssa_schema", "st_schema", "public"]
}
generator client {
provider = "prisma-client-js"
previewFeatures = ["multiSchema"] // <20>舐鍂憭锭chema<6D><EFBFBD>
}
```
**隞<><E99A9E>銝剔<E98A9D>雿輻鍂嚗?*
```typescript
// <20>芸𢆡頝舐眏<E88890>唳迤蝖桃<E89D96>Schema
await prisma.user.findMany() // 霈輸䔮 platform_schema.users
await prisma.project.findMany() // 霈輸䔮 aia_schema.projects
```
### 4. <20><EFBFBD>SQL霈輸䔮嚗<E494AE>楊Schema嚗?
```typescript
// <20><EFBFBD>頝沒chema<6D>亥砭
const result = await prisma.$queryRaw`
SELECT u.name, p.name AS project_name
FROM platform_schema.users u
JOIN aia_schema.projects p ON p.user_id = u.id
`
```
### 5. 隡㗛<E99AA1><E3979B>喲𡡒<E596B2><EFBFBD>
```typescript
// AIclinicalresearch/backend/src/config/database.ts
process.on('SIGTERM', () => gracefulShutdown('SIGTERM')) // SAE摰硺<E691B0><E7A1BA>𨀣迫
process.on('SIGINT', () => gracefulShutdown('SIGINT')) // Ctrl+C
async function gracefulShutdown(signal: string): Promise<void> {
await prisma.$disconnect() // <20>喲𡡒<E596B2><F0A1A192><EFBFBD><EFBFBD><E39591>? process.exit(0)
}
```
**餈蹱糓鈭穃<E988AD><E7A983><EFBFBD><EFBFBD>雿喳<E99BBF>頝?*嚗屸俈甇㏎AE<41>拙捆/蝻拙捆<E68B99><EFBFBD><E59789><EFBFBD>瞍譌<E79E8D>?
---
## 擐𡝗活<F0A19D97>函蔡<E587BD><EFBFBD>
### <20><EFBFBD>撖寞<E69296>
| <20><EFBFBD> | <20><EFBFBD> | 隡条<E99AA1> | 蝻箇<E89DBB> | <20><EFBFBD>摨?|
|------|------|------|------|--------|
| **<EFBFBD><EFBFBD>A** | `pg_dump` <20><EFBFBD>撖澆<E69296> | <20>?100%摰峕㟲嚗<E39FB2><E59A97><EFBFBD>殆g-boss銵剁<E98AB5><br><3E>?蝏𤘪<E89D8F>+<2B>唳旿+蝝<E89D9D>+憭㚚睸<br><3E>?銝<>甈⊥<E79488><EFBFBD><E689B9>?| <20>?<3F><><EFBFBD><E996AC>撌交<E6928C><E4BAA4><EFBFBD><EFBFBD>霂閙㺭<E99699>?br><3E>?<3F><><EFBFBD><EFBFBD><E39B96><EFBFBD>ublic銵?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?**撘箇<E69298><E7AE87><EFBFBD>** |
| **<EFBFBD><EFBFBD>B** | Prisma Migrate Deploy | <20>?<3F><>𧋦<EFBFBD>𣇉恣<F0A38789>?br><3E>?<3F><EFBFBD>憭齿<E686AD>銵?| <20>?蝻箏<E89DBB>pg-boss銵剁<E98AB5>餈鞱<E9A488><E99EB1><EFBFBD><E597A1>仿<EFBFBD>嚗?br><3E>?<3F><><EFBFBD><E996AC>撌亥<E4BAA5>?| <20>𩤃<EFBFBD> **銝齿綫<E9BDBF>?*嚗<><E59A97>摰峕㟲嚗?|
| **<EFBFBD><EFBFBD>C** | <20>见極SQL<51>𡁏𧋦 | <20>?摰<><E691B0><EFBFBD>舀綉 | <20>?撌乩<E6928C><E4B9A9>誩之<br><3E>?摰寞<E691B0><E5AF9E><EFBFBD> | <20>𩤃<EFBFBD> **銝齿綫<E9BDBF>?*嚗<><EFBFBD>嗉晶<E59789>𨥈<EFBFBD> |
### 潃?<3F><EFBFBD><E588BB><EFBFBD>A嚗䮝g_dump<6D><EFBFBD>撖澆<E69296><EFBFBD>祕蝏<E7A595>郊撉歹<E69289>
#### 甇仿炊1嚗𡁏𧋦<F0A1818F>唳㺭<E594B3><EFBFBD><EFBFBD><E79A9C><EFBFBD><EFBFBD><EFBFBD>
```bash
# 憒<><E68692><EFBFBD>砍𧑐<E7A08D><EFBFBD>霂閙㺭<E99699><EFBFBD><E6AEB7>臭誑<E887AD>㗇𥋘皜<F0A58B98><E79A9C>
docker exec -it ai-clinical-postgres psql -U postgres -d ai_clinical_research
# <20>𣳇膄瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>摰䂿鍂<E482BF><EFBFBD>
DELETE FROM platform_schema.users WHERE email LIKE '%test%';
# 皜<><E79A9C><EFBFBD><EFBFBD><E39B96>?public.users嚗𠄎chema餈<61><EFBFBD>𡒊<EFBFBD><F0A1928A>扯”嚗?DROP TABLE IF EXISTS public.users;
```
#### 甇仿炊2嚗𡁜紡<F0A1819C>箸㺭<E7AEB8><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD><E6808E>?<3F>唳旿嚗?
```bash
# 摰峕㟲撖澆枂嚗<E69E82><E59A97><EFBFBD><EFBFBD><E7A586>农chema<6D><61><EFBFBD><E2809D><EFBFBD><EFBFBD><E69FB4>揣撘𨰻<E69298><F0A8B0BB><EFBFBD><EFBFBD><EFBFBD>
docker exec ai-clinical-postgres pg_dump -U postgres -d ai_clinical_research \
--format=plain \
--no-owner \
--no-acl \
--encoding=UTF8 \
> D:\MyCursor\ai_clinical_research_backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql
# <20><>辣憭批<E686AD>摨磰砲<E7A3B0>?100-200 KB嚗<42><E59A97><EFBFBD>齿㺭<E9BDBF><EFBFBD>26MB嚗?```
**<2A><>㺭霂湔<E99C82>嚗?*
- `--format=plain`嚗𡁶滲<EFBFBD><EFBFBD>𧋦SQL嚗<EFBFBD>䲮靘踵䰻<EFBFBD><EFBFBD>蝻𤥁<EFBFBD>嚗?- `--no-owner`嚗帋<EFBFBD>撖澆枂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RDS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?- `--no-acl`嚗帋<EFBFBD>撖澆枂<EFBFBD><EFBFBD><EFBFBD>靽⊥<EFBFBD><EFBFBD><EFBFBD>沖DS暺䁅恕<EFBFBD><EFBFBD><EFBFBD>嚗?- `--encoding=UTF8`嚗䦧TF-8蝻𣇉<E89DBB><EFBFBD><EFBFBD><E89189>𣈲<EFBFBD><F0A388B2><EFBFBD>
#### 甇仿炊3嚗鑹DS PostgreSQL 15 <20><><EFBFBD>
```bash
# 1. <20>券燵<E588B8><EFBFBD><E494B6><EFBFBD><E689B9><EFBFBD>撱摧DS PostgreSQL 15摰硺<E691B0>
<EFBFBD>聢嚗鬏ds.pg.s2.large嚗?<3F>?GB嚗<42><E59A97><EFBFBD>函漣嚗?摮睃<E691AE>嚗?00GB SSD嚗<44>𣈲<EFBFBD><F0A388B2><EFBFBD><EFBFBD>摰對<E691B0>
<EFBFBD><EFBFBD>𧋦嚗䥪ostgreSQL 15
蝵𤑳<EFBFBD>嚗间PC嚗<EFBFBD><EFBFBD>SAE<EFBFBD><EFBFBD><EFBFBD>VPC嚗?<3F><EFBFBD><E8B3A2>𤏪<EFBFBD><F0A48FAA>𩤃<EFBFBD><><EFBFBD>滨蔭VPC蝵烐挾嚗䔶<E59A97><E494B6>賜鍂<E8B39C>閙㦤IP嚗? - 蝷箔<E89DB7>嚗?72.16.0.0/12嚗𠄎AE<41><45>PC蝵烐挾嚗? - <20><EFBFBD><E4BAA6><EFBFBD>嚗锭AE<41><EFBFBD><E689B9>?> 摨𠉛鍂霂行<E99C82> > 蝵𤑳<E89DB5><F0A491B3>滨蔭 > VPC蝵烐挾
- <20>?<3F>躰秤蝷箔<E89DB7>嚗?72.16.1.23嚗<EFBFBD><EFBFBD><EFBFBD>截P嚗玺AE摰硺<EFBFBD>IP隡𡁜<EFBFBD><EFBFBD><EFBFBD>
# 2. <20>𥕦遣<F0A595A6>唳旿摨?CREATE DATABASE ai_clinical_research
WITH ENCODING='UTF8'
LC_COLLATE='en_US.UTF-8'
LC_CTYPE='en_US.UTF-8'
TEMPLATE=template0;
# 3. <20>𥕦遣摨𠉛鍂<F0A0899B><EFBFBD><EFBFBD><E59A97><EFBFBD>鍂頞<E98D82><EFBFBD><EFBFBD>嚗?CREATE USER aiclinical_rw WITH PASSWORD '雿删<E99BBF>撘箏<E69298><E7AE8F>?;
GRANT ALL PRIVILEGES ON DATABASE ai_clinical_research TO aiclinical_rw;
GRANT ALL ON SCHEMA public TO aiclinical_rw;
```
#### 甇仿炊4嚗𡁜紡<F0A1819C><EFBFBD>RDS
```bash
# <20><EFBFBD>1嚗帋<E59A97><E5B88B>砍𧑐<E7A08D>湔𦻖撖澆<E69296><EFBFBD><E59A97><EFBFBD>DS<44><EFBFBD><E7A589><EFBFBD>嚗?psql -h rm-xxxxx.pg.rds.aliyuncs.com \
-p 5432 \
-U aiclinical_rw \
-d ai_clinical_research \
-f ai_clinical_research_backup_20251214_150000.sql
# <20><EFBFBD>2嚗𡁻<E59A97><EFBFBD>ECS頝單踎<E596AE>箏紡<E7AE8F><EFBFBD><E4BC90><EFBFBD>嚗峕凒摰匧<E691B0>嚗?scp backup.sql root@your-ecs-ip:/tmp/
ssh root@your-ecs-ip
psql -h rm-xxxxx.pg.rds.aliyuncs.com -U aiclinical_rw -d ai_clinical_research -f /tmp/backup.sql
```
#### 甇仿炊5嚗𡁻<E59A97><EFBFBD><EFBFBD><EFBFBD><E4BAA6>?
```sql
-- 1. 撉諹<E69289>Schema<6D><EFBFBD>
SELECT nspname FROM pg_namespace WHERE nspname LIKE '%_schema' ORDER BY nspname;
-- 摨磰砲<E7A3B0>?0銝杵chema
-- 2. 撉諹<E69289>銵冽㺭<E586BD>?SELECT schemaname, COUNT(*) as table_count
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
GROUP BY schemaname
ORDER BY schemaname;
-- platform_schema: 8, aia_schema: 5, pkb_schema: 5, asl_schema: 6, dc_schema: 6
-- 3. 撉諹<E69289><E8ABB9>唳旿<E594B3>?SELECT COUNT(*) FROM platform_schema.users; -- 摨磰砲<E7A3B0>?<3F><EFBFBD><E288B4><EFBFBD>靽萘<E99DBD><E89098><EFBFBD><EFBFBD>𧶏<EFBFBD>
SELECT COUNT(*) FROM aia_schema.projects; -- 摨磰砲<E7A3B0>?<3F>?SELECT COUNT(*) FROM asl_schema.literatures; -- 摨磰砲<E7A3B0>匧笆摨娍㺭<E5A88D>?
-- 4. 撉諹<E69289>pg-boss銵剁<E98AB5><E58981>喲睸嚗?SELECT tablename FROM pg_tables WHERE schemaname = 'platform_schema' ORDER BY tablename;
-- 摨磰砲<E7A3B0><E7A0B2>𡠺嚗餷ob, job_common, queue, schedule, subscription, version
-- 5. 撉諹<E69289>憭㚚睸蝥行<E89DA5>
SELECT conname, conrelid::regclass, confrelid::regclass
FROM pg_constraint
WHERE contype = 'f'
LIMIT 10;
```
#### 甇仿炊6嚗𡁻<E59A97>蝵娟AE<41><EFBFBD><E887AC><EFBFBD>
```bash
# <20>沒AE摨𠉛鍂<F0A0899B>滨蔭銝剜溶<E5899C>?DATABASE_URL=postgresql://aiclinical_rw:撘箏<E69298><E7AE8F><EFBFBD>rm-xxxxx.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=10&pool_timeout=10&connect_timeout=10
# <20><EFBFBD><E597A1><EFBFBD><E8A9A8>滨蔭
DB_MAX_CONNECTIONS=400 # RDS<44><53>憭扯<E686AD><E689AF>交㺭
MAX_INSTANCES=20 # SAE<41><45>憭批<E686AD>靘𧢲㺭
NODE_ENV=production
```
#### 甇仿炊7嚗𡁜<E59A97><F0A1819C>典鍳<E585B8><EFBFBD>霂?
```typescript
// backend<6E>臬𢆡<E887AC><EFBFBD><E597A1>芸𢆡<E88AB8><EFBFBD>
npm run build
npm run start
// <20><EFBFBD>颲枏枂摨磰砲<E7A3B0>曄內嚗?// <20>?<3F>唳旿摨栞<E691A8><E6A09E><EFBFBD><E4BAA4><EFBFBD><EFBFBD>
// <20><> <20>唳旿摨梶<E691A8><E6A2B6>? PostgreSQL 15.x
// <20><> 敶枏<E695B6><E69E8F>唳旿摨栞<E691A8><E6A09E>交㺭: 1
```
#### 甇仿炊8嚗䥪risma Client<6E><74><EFBFBD><EFBFBD><E59A97><EFBFBD><E996AC>
```bash
# <20>灸ackend<6E><EFBFBD>銝?cd backend
npx prisma generate
# 撉諹<E69289><E8ABB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lient
ls node_modules/.prisma/client/
# 摨磰砲<E7A3B0><E7A0B2><EFBFBD><E98984><EFBFBD>农chema<6D><61><EFBFBD><EFBFBD>銋?```
### <20>𩤃<EFBFBD> <20><EFBFBD>B銝箔<E98A9D><EFBFBD><E98A8B><EFBFBD><EFBFBD>嚗䥪risma Migrate<74><65><EFBFBD><EFBFBD>?
```bash
# 憒<><E68692><EFBFBD><EFBFBD> prisma migrate deploy
cd backend
npx prisma migrate deploy
# <20><EFBFBD>1嚗𡁶撩撠?pg-boss 銵?# prisma migrate deploy <20><EFBFBD><E88AAF>𥕦遣 Prisma Schema 銝剖<E98A9D>銋厩<E98A8B>銵?# 銝滢<E98A9D><E6BBA2>𥕦遣 pg-boss <20>?6 銝芾”嚗àob, queue蝑㚁<E89D91>
# <20><EFBFBD>2嚗𡁜<E59A97><F0A1819C>典鍳<E585B8>冽𧒄<E586BD>仿<EFBFBD>
# Error: relation "platform_schema.job" does not exist
# <20>牐蛹隞<E89BB9><E99A9E>銝凋蝙<E5878B><EFBFBD> pg-boss嚗䔶<E59A97>銵其<E98AB5>摮睃銁
# <20><EFBFBD>3嚗𡁻<E59A97><EFBFBD><E996AC>撌亥<E4BAA5>?# 敹<><EFBFBD>见極<E8A781><EFBFBD> pg-boss <20><><EFBFBD>憪见<E686AA>SQL
# <20>𧼮虜蝜<E8999C><E89D9C>銝𥪜捆<F0A5AA9C>枏枂<E69E8F>?```
**蝏栞捏嚗䫤pg_dump` <20><EFBFBD>撖澆<E69296><E6BE86><EFBFBD>甈⊿<E79488>蝵脩<E89DB5><E884A9><EFBFBD>雿單䲮獢<E4B2AE><E78DA2>**
---
## <20>芣䔉<E88AA3>湔鰵蝑𣇉裦
### <20>箸艶1嚗𡁏鰵憓硺<E68693>銝芾”<E88ABE>碶耨<E7A2B6><EFBFBD>銝芸<E98A9D>畾蛛<E795BE>撠𤩺凒<F0A4A9BA><EFBFBD>
#### <20><EFBFBD><E588BB><EFBFBD>嚗䥪risma Migrate嚗<65><E59A97><EFBFBD><EFBFBD>蝞∠<E89D9E>嚗?
```bash
# 甇仿炊1嚗𡁜銁<F0A1819C>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493><EFBFBD>?schema.prisma
# 蝷箔<E89DB7>嚗帋蛹 User 銵冽溶<E586BD><EFBFBD>銝芸<E98A9D>畾?model User {
id String @id @default(uuid())
email String @unique
// ... <20><EFBFBD>摮埈挾 ...
phoneNumber String? @map("phone_number") // <20><EFBFBD>摮埈挾
@@map("users")
@@schema("platform_schema")
}
# 甇仿炊2嚗𡁜<E59A97>撱箄<E692B1>蝘鳴<E89D98><E9B3B4>砍𧑐嚗?cd backend
npx prisma migrate dev --name add_user_phone_number
# <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝘餅<E89D98>隞嗥內靘页<E99D98>
# backend/prisma/migrations/20251214120000_add_user_phone_number/migration.sql
ALTER TABLE "platform_schema"."users" ADD COLUMN "phone_number" TEXT;
# 甇仿炊3嚗𡁏<E59A97>霂閙𧋦<E99699><EFBFBD>蝘?npm run dev
# 撉諹<E69289><E8ABB9><EFBFBD>畾萄虾<E89084>?
# 甇仿炊4嚗𡁏<E59A97>鈭文<E988AD>Git
git add backend/prisma/migrations/20251214120000_add_user_phone_number
git commit -m "feat: add phone_number to User model"
git push
# 甇仿炊5嚗𡁻<E59A97>蝵脣<E89DB5>SAE嚗<45><EFBFBD><EFBFBD>銵諹<E98AB5>蝘鳴<E89D98>
# <20>?SAE <20><><EFBFBD><EFBFBD>典鍳<E585B8>典𦶢隞支葉瘛餃<E7989B>嚗?# CMD ["sh", "-c", "npx prisma migrate deploy && node dist/index.js"]
# <20>𩤃<EFBFBD> 瘜冽<E7989C>嚗鋽ockerfile <20>?CMD 摨磰砲<E7A3B0><EFBFBD>
CMD ["sh", "-c", "node dist/index.js"]
# 銝滩<E98A9D><E6BBA9><EFBFBD>鈭批鍳<E689B9>冽𧒄<E586BD><EFBFBD> migrate deploy嚗<79><E59A97><EFBFBD>拙云憭改<E686AD>
# 甇仿炊6嚗𡁏<E59A97>撌交<E6928C>銵諹<E98AB5>蝘鳴<E89D98><E9B3B4><EFBFBD>嚗?# <20><EFBFBD>1嚗𡁻<E59A97><EFBFBD>ECS頝單踎<E596AE><EFBFBD>銵?ssh root@your-ecs-ip
psql -h rm-xxxxx.pg.rds.aliyuncs.com -U aiclinical_rw -d ai_clinical_research \
-f migrations/20251214120000_add_user_phone_number/migration.sql
# <20><EFBFBD>2嚗帋蝙<E5B88B>?RDS <20><EFBFBD><E689B9><EFBFBD> SQL 蝒堒藁
# <20>湔𦻖蝎䁅斐餈<E69690>宏SQL<51><EFBFBD>
# 甇仿炊7嚗𡁻<E59A97>霂?SELECT column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'platform_schema'
AND table_name = 'users'
AND column_name = 'phone_number';
```
**銝箔<E98A9D><EFBFBD><E98A8B><EFBFBD><EFBFBD><E588BB>典鍳<E585B8>典𦶢隞支葉<E694AF><EFBFBD> `prisma migrate deploy`嚗?*
1. **撟嗅<E6929F>憌𡡞埯**嚗锭AE<41><EFBFBD>銝芸<E98A9D>靘页<E99D98><E9A1B5><EFBFBD><E888AA>峕𧒄<E5B395><EFBFBD><EFBFBD>
2. **<EFBFBD><EFBFBD><EFBFBD>圈𠗕**嚗𡁜<E59A97><F0A1819C>𡏭<EFBFBD>蝘餃仃韐伐<E99F90>摨𠉛鍂撌脩<E6928C><E884A9>臬𢆡
3. **<EFBFBD>唳旿摰匧<EFBFBD>**嚗𡁶<E59A97>鈭扳㺭<E689B3><EFBFBD>摨磰砲<E7A3B0>见極餈<E6A5B5>宏嚗峕<E59A97><EFBFBD><EFBFBD><E981A2><EFBFBD>皛朞恣<E69C9E>?
### <20>箸艶2嚗𡁏鰵憓硺<E68693>銝芸之璅<E79285><EFBFBD><E59A97>SSA<53><EFBFBD>蝏蠘恣<E8A098><E681A3><EFBFBD>嚗?
#### <20><EFBFBD><E588BB><EFBFBD>嚗𡁶<E59A97><F0A181B6><EFBFBD><EFBFBD><EFBFBD>宏瘚<E5AE8F><E7989A>
```bash
# 甇仿炊1嚗𡁜銁<F0A1819C>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493>挽霈﹖chema
# 蝷箔<E89DB7>嚗锭SA嚗<41><EFBFBD><EFBFBD><E99C88><E288AA><EFBFBD><E79285>
# backend/prisma/schema.prisma
// SSA Schema嚗<61>鰵憓痹<E68693>
model SsaAnalysisTask {
id String @id @default(uuid())
userId String @map("user_id")
projectId String @map("project_id")
taskName String @map("task_name")
status String @default("pending")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
user User @relation(fields: [userId], references: [id])
results SsaAnalysisResult[]
@@map("analysis_tasks")
@@schema("ssa_schema")
}
model SsaAnalysisResult {
id String @id @default(uuid())
taskId String @map("task_id")
resultType String @map("result_type")
resultData Json @map("result_data")
createdAt DateTime @default(now()) @map("created_at")
task SsaAnalysisTask @relation(fields: [taskId], references: [id])
@@map("analysis_results")
@@schema("ssa_schema")
}
# 甇仿炊2嚗𡁜<E59A97>撱箄<E692B1>蝘?npx prisma migrate dev --name add_ssa_module
# 甇仿炊3嚗𡁻<E59A97><EFBFBD><E99C82>蝘艋QL
# backend/prisma/migrations/20251214_add_ssa_module/migration.sql
-- 璉<><E79289><EFBFBD>
-- 1. <20>臬炏<E887AC>?ssa_schema 銝剖<E98A9D>撱箄”
-- 2. 憭㚚睸<E39A9A>臬炏甇<E7828F>撘閧鍂 platform_schema.users
-- 3. 蝝<E89D9D><EFBCB7>臬炏摰峕㟲
# 甇仿炊4嚗𡁏𧋦<F0A1818F><EFBFBD>霂?# 撘<><E69298>騌SA璅<E79285><E288AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
# 蝖桐<E89D96><E6A190><EFBFBD><EFBFBD>攊RUD<55><EFBFBD><EFBFBD>
# 甇仿炊5嚗𡁜<E59A97><EFBFBD><E686AD>鈭折<E988AD>蝵?# 5.1 <20>唳旿摨枏<E691A8>隞踝<E99A9E>撘箏<E69298>嚗?# <20>沖DS<44><EFBFBD><E689B9><EFBFBD><E594B3><EFBFBD>撱箏翰<E7AE8F><EFBFBD>ai_clinical_research_before_ssa_module_20251214
# 5.2 <20><><EFBFBD><EFBFBD><EFBFBD><E5A2A7>𡁏𧋦
# backend/prisma/migrations/20251214_add_ssa_module/rollback.sql
DROP TABLE IF EXISTS ssa_schema.analysis_results CASCADE;
DROP TABLE IF EXISTS ssa_schema.analysis_tasks CASCADE;
# 甇仿炊6嚗𡁶<E59A97>鈭抒㴓憓<E3B493><E68693>蝘鳴<E89D98><E9B3B4><EFBFBD><EFBFBD><EFBFBD>嚗?# 6.1 <20>𨀣㦤蝒堒藁嚗<E89781><EFBFBD><EFBFBD><EFBFBD><E68692><EFBFBD><EFBFBD><E4ADBE><EFBFBD><E59785><EFBFBD>
# <20><EFBFBD>11<31>?<3F>峕膥2<E886A5><EFBFBD><E5B08D><EFBFBD><E586BD><EFBFBD>撠?
# 6.2 <20><EFBFBD><EFBFBD>宏SQL
psql -h rm-xxxxx.pg.rds.aliyuncs.com -U aiclinical_rw -d ai_clinical_research \
-f migrations/20251214_add_ssa_module/migration.sql
# 6.3 撉諹<E69289>銵函<E98AB5><E587BD>?\dt ssa_schema.*
\d ssa_schema.analysis_tasks
\d ssa_schema.analysis_results
# 6.4 撉諹<E69289>憭㚚睸
SELECT conname, conrelid::regclass, confrelid::regclass
FROM pg_constraint
WHERE connamespace = 'ssa_schema'::regnamespace;
# 甇仿炊7嚗𡁻<E59A97>蝵脣<E89DB5><E884A3>其誨<E585B6>?# 7.1 <20>湔鰵backend
git pull
npm run build
# SAE<41>芸𢆡<E88AB8>函蔡<E587BD>𡝗<EFBFBD><F0A19D97>刻圻<E588BB><EFBFBD>蝵?
# 7.2 <20>亙熒璉<E78692><E79289>?curl https://your-backend.sae.aliyuncs.com/health
# 摨磰砲餈𥪜<E9A488> 200 OK
# 甇仿炊8嚗𡁶<E59A97><F0A181B6><EFBFBD>霂𤏪<E99C82>Smoke Testing嚗?# 8.1 瘚贝<E7989A>SSA璅<E79285><E288AA>箸𧋦<E7AEB8><EFBFBD>
POST /api/v1/ssa/analysis-tasks
GET /api/v1/ssa/analysis-tasks/:id
# 8.2 瘚贝<E7989A><E8B49D>扳芋<E689B3><EFBFBD><E6A2B9>𧼮<EFBFBD>瘚贝<E7989A>嚗?GET /api/v1/aia/projects
GET /api/v1/pkb/knowledge-bases
# 蝖桐<E89D96><E6A190><EFBFBD><E689B9><EFBFBD><E8B3AD>堒蔣<E5A092>?
# 甇仿炊9嚗𡁶<E59A97><F0A181B6>?4撠𤩺𧒄
# 9.1 RDS<44>烐綉
# - 餈墧𦻖<E5A2A7>唳糓<E594B3>行迤撣?# - CPU/<2F><><EFBFBD>雿輻鍂<E8BCBB>?# - <20>䰻霂𠯫敹?
# 9.2 SAE<41>烐綉
# - 摨𠉛鍂<F0A0899B><EFBFBD><EFBFBD><E59A97>霂舀㺭<E88880>𧶏<EFBFBD>
# - API<50><EFBFBD><E6BB9A>園𡢿
# - 摰硺<E691B0><E7A1BA>亙熒<E4BA99><EFBFBD>?
# 甇仿炊10嚗𡁜<E59A97><F0A1819C>𨅯仃韐伐<E99F90>蝡见朖<E8A781><EFBFBD>
# 10.1 <20><EFBFBD><E5A2A7>唳旿摨?psql -h rm-xxxxx.pg.rds.aliyuncs.com -U aiclinical_rw -d ai_clinical_research \
-f migrations/20251214_add_ssa_module/rollback.sql
# 10.2 <20><EFBFBD>摨𠉛鍂隞<E98D82><E99A9E>
# <20>沒AE<41><EFBFBD><E689B9><EFBFBD>㗇𥋘銝𠹺<E98A9D>銝芰<E98A9D><E88AB0>穿<EFBFBD><E7A9BF>孵稬"<22><EFBFBD>"
# 10.3 <20><EFBFBD>RDS敹怎<E695B9><EFBFBD><E59A97><EFBFBD>𨅯<EFBFBD><EFBFBD><E996AC>
# <20>沖DS<44><EFBFBD><E689B9><EFBFBD>憭滚翰<E6BB9A><EFBFBD>ai_clinical_research_before_ssa_module_20251214
```
### <20>箸艶3嚗𡁶揮<F0A181B6>乩耨憭㵪<E686AD>Hotfix嚗?
```bash
# 蝷箔<E89DB7>嚗䮝roduction<6F><EFBFBD><E887AC>𤑳緵<F0A491B3>𣂷葵摮埈挾<E59F88>踹漲銝滚<E98A9D>
# 甇仿炊1嚗𡁏𧋦<F0A1818F><EFBFBD>撱箇揮<E7AE87><EFBFBD>蝘?# backend/prisma/schema.prisma
model User {
// 撠?email 摮埈挾<E59F88>踹漲隞?varchar(255) <20>嫣蛹 text
email String @unique // Prisma暺䁅恕<E48185>眩ext嚗峕<E59A97><E5B395><EFBFBD>靽格㺿
// ...
}
# 甇仿炊2嚗𡁶<E59A97><F0A181B6><EFBFBD>蝘?npx prisma migrate dev --name hotfix_user_email_length
# 甇仿炊3嚗𡁏<E59A97>霂閗<E99C82>蝘艋QL嚗<4C>𧋦<EFBFBD><EFBFBD>
# 蝖桐<E89D96>銝滢<E98A9D><EFBCB7>唳旿
# 甇仿炊4嚗𡁶<E59A97>鈭抒㴓憓<E3B493><E68693>銵䕘<E98AB5>敹恍<E695B9><EFBFBD>𡁻<EFBFBD>嚗?# 4.1 憭<>遢嚗<E981A2><EFBFBD><EFBFBD>
# RDS<44><EFBFBD><E689B9>?> 憭<>遢 > 蝡见朖憭<E69C96>遢 > 憭<>釣嚗冴otfix_before_email_length
# 4.2 <20><EFBFBD>SQL嚗<4C><E59A97><EFBFBD>SQL蝒堒藁嚗𣬚<E59A97>蝥批<E89DA5><E689B9><EFBFBD>
ALTER TABLE platform_schema.users ALTER COLUMN email TYPE TEXT;
# 4.3 撉諹<E69289>
SELECT column_name, data_type, character_maximum_length
FROM information_schema.columns
WHERE table_schema = 'platform_schema'
AND table_name = 'users'
AND column_name = 'email';
# 4.4 <20>𣂷漱Git
git add backend/prisma/migrations/20251214_hotfix_user_email_length
git commit -m "hotfix: increase user email column length"
git push
```
---
## RDS憭<53>遢蝑𣇉裦
### 1. <20><EFBFBD>鈭駵DS<44>芸𢆡憭<F0A286A1>遢嚗<E981A2><EFBFBD><E692A9><EFBFBD><EFBFBD><E7909C>?
#### 1.1 <20>滨蔭<E6BBA8>芸𢆡憭<F0A286A1>
```bash
# <20>沖DS<44><EFBFBD><E689B9><EFBFBD>蝵?憭<>遢霈曄蔭 > 憭<>遢蝑𣇉裦
# <20><EFBFBD><E588BB>滨蔭嚗?<3F>唳旿憭<E697BF>遢靽萘<E99DBD><E89098>園𡢿嚗?憭抬<E686AD><E68AAC>滩晶憸嘥漲嚗?<3F><EFBFBD><EFBFBD>遢靽萘<E99DBD><E89098>園𡢿嚗?憭?憭<><EFBFBD><EFBFBD>嚗𡁏<E59A97>憭拐<E686AD>甈?憭<><EFBFBD>園𡢿嚗𡁜<E59A97><F0A1819C>?:00-4:00嚗<30><E59A97><EFBFBD><EFBFBD>撜唳<E6929C>嚗?憭<><EFBFBD><EFBFBD>嚗𡁶<E59A97><F0A181B6><EFBFBD><EFBFBD>隞踝<E99A9E>敹恬<E695B9><E681AC>删鍂蝛粹𡢿撠𧶏<E692A0>
```
**隡睃飵嚗?*
- <20>?<3F>刻䌊<E588BB><EFBFBD><E58981>𣳇<EFBFBD>鈭箏極撟脤<E6929F>
- <20>?<3F>園𡢿<E59C92><EFBFBD>憭㵪<E686AD>Point-in-Time Recovery嚗釶ITR嚗㚁<E59A97><E39A81><EFBFBD>憭滚<E686AD>隞餅<E99A9E>蝘?- <20>?摮睃<E691AE><E79D83>汰SS嚗𣬚𡠺蝡衤<E89DA1>RDS摰硺<E691B0>
- <20>?<3F>滩晶嚗?憭拙<E686AD>嚗?
#### 1.2 <20>见𢆡敹怎<E695B9><EFBFBD><E59A97><EFBFBD><E996AC>雿𨅯<E99BBF>嚗?
```bash
# <20>箸艶嚗?# - 憭抒<E686AD><E68A92><EFBFBD>蝥批<E89DA5>
# - <20>唳旿摨廍chema<6D>滚之<E6BB9A>䀹凒<E480B9>?# - <20>𣳇膄憭折<E686AD><E68A98>唳旿<E594B3>?
# <20><EFBFBD>嚗?RDS<44><EFBFBD><E689B9>?> 憭<><EFBFBD><EFBFBD> > 憭<>遢摰硺<E691B0> > <20>𥕦遣憭<E981A3>
<EFBFBD><EFBFBD><EFBFBD>嚗𡁶<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞?憭<>釣嚗饢igration_before_ssa_module_20251214
```
**敹怎<E695B9>靽萘<E99DBD>撱箄悅嚗?*
-<><EFBFBD>滚翰<E6BB9A><EFBFBD>靽萘<E99DBD>30憭?- <20><>𧋦<EFBFBD><F0A78BA6><EFBFBD>滚翰<E6BB9A><EFBFBD>靽萘<E99DBD>60憭?- 摮<>漲敶埝﹝敹怎<E695B9>嚗帋<E59A97><E5B88B>?撟?
### 2. <20><EFBFBD><EFBFBD>遢嚗Ǒpg_dump`嚗? <20><EFBFBD><EFBFBD><E58EA9><EFBFBD>銝𡁜𦛚<F0A1819C>𡁜之<F0A1819C>𤾸<EFBFBD><F0A4BEB8><EFBFBD><EFBFBD>嚗?
**<2A>𩤃<EFBFBD> <20><EFBFBD>撱箄悅嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD>䌊撌勗<E6928C><E58B97>𡁏𧋦嚗朙DS<44>芸𢆡憭<F0A286A1>遢撠勗<E692A0><EFBFBD><E988AD>**
| <20>嗆挾 | 憭<>遢蝑𣇉裦 | <20><>眏 |
|------|---------|------|
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | <20>?<3F>芰鍂RDS<44>芸𢆡憭<F0A286A1>遢 | - <20>芸𢆡憭<F0A286A1>遢+<2B><EFBFBD><EFBFBD>遢=PITR嚗<52><EFBFBD>𤩺𧒄<F0A4A9BA><EFBFBD><E6B8A1><EFBFBD>嚗?br>- <20><EFBFBD>鈭烐<E988AD>蝞∴<E89D9E>蝔喳<E89D94><E596B3><EFBFBD><br>- <20>𣳇<EFBFBD>蝏湔擪<E6B994>𡁏𧋦<F0A1818F>袏CS |
| **<EFBFBD>鞾鵭<EFBFBD>?* | <20><EFBFBD><EFBFBD>憓𧼮<E68693><EFBFBD>𧑐<EFBFBD><EFBFBD> | - 銝𡁜𦛚<F0A1819C>喲睸<E596B2>𠬍<EFBFBD><F0A0AC8D><EFBFBD><EFBFBD>憭𡁜𧑐<F0A1819C><EFBFBD>隞?br>- 雿輻鍂RDS<44>?頝典𧑐<E585B8><EFBFBD>隞?<3F><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>蝵殷<E89DB5> |
| **<EFBFBD><EFBFBD><EFBFBD>?* | <20><EFBFBD><EFBFBD><E39A81><EFBFBD>銋匧<E98A8B>隞?| - <20><><EFBFBD>鸌畾𠰴<E795BE>隞賜<E99A9E><E8B39C><EFBFBD><EFBFBD><E68692>撠𤩺𧒄憭<F0A79284>遢嚗?br>- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E78DA2>憒?撟湛<E6929F> |
**憒<><E68692><EFBFBD>芣䔉<E88AA3><E49489><EFBFBD>䌊摰帋<E691B0><EFBFBD>遢嚗<E981A2><E59A97><EFBFBD><EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD>**
```bash
# <20>𩤃<EFBFBD><><E99A9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝漤<E98A9D><EFBFBD><E996AC>銵?#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/data/pg_backups"
RDS_HOST="rm-xxxxx.pg.rds.aliyuncs.com"
RDS_USER="aiclinical_rw"
RDS_DB="ai_clinical_research"
# 撖澆枂SQL
pg_dump -h $RDS_HOST -U $RDS_USER -d $RDS_DB \
--format=plain \
--no-owner \
--no-acl \
--encoding=UTF8 \
--file=$BACKUP_DIR/ai_clinical_research_$DATE.sql
# <20>讠憬撟嗡<E6929F>隡惩<E99AA1>OSS
gzip $BACKUP_DIR/ai_clinical_research_$DATE.sql
ossutil cp $BACKUP_DIR/ai_clinical_research_$DATE.sql.gz \
oss://your-bucket/database-backups/
# 皜<><E79A9C><EFBFBD>砍𧑐憭<F0A79190>
ls -t $BACKUP_DIR/*.sql.gz | tail -n +4 | xargs rm -f
```
**<EFBFBD><EFBFBD>嚗𡁜<EFBFBD><EFBFBD><EFBFBD>瘜沖DS<EFBFBD>芸𢆡憭<EFBFBD>遢嚗𣬚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𨥈<EFBFBD>**
### 3. <20><EFBFBD>瞍𠉛<E79E8D><EFBFBD><E59A97><EFBFBD>漲銝<E6BCB2>甈∴<E79488>
```bash
# <20><EFBFBD>嚗𡁻<E59A97><EFBFBD><E99C82>隞賢虾<E8B3A2><EFBFBD><E58981><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7989A>
# 甇仿炊1嚗𡁜<E59A97>撱箸<E692B1>霂𥵃DS摰硺<E691B0>
# RDS<44><EFBFBD><E689B9>?> <20>𥕦遣摰硺<E691B0> > <20><EFBFBD>隞賢<E99A9E>撱?# <20>㗇𥋘<E39787><F0A58B98><EFBFBD><EFBFBD><E59581>芸𢆡憭<F0A286A1><EFBFBD>硋翰<E7A18B>?
# 甇仿炊2嚗𡁻<E59A97><EFBFBD><EFBFBD><EFBFBD><E6A180><EFBFBD>?psql -h test-rm-xxxxx.pg.rds.aliyuncs.com -U aiclinical_rw -d ai_clinical_research
# 璉<><E79289><EFBFBD>
SELECT schemaname, COUNT(*) FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
GROUP BY schemaname;
SELECT COUNT(*) FROM platform_schema.users;
# 甇仿炊3嚗朞扇敶閙<E695B6>憭齿𧒄<E9BDBF>?# 26MB<4D>唳旿摨橒<E691A8>摰峕㟲<E5B395><EFBFBD>蝥?-10<31><30><EFBFBD>
# 甇仿炊4嚗𡁜<E59A97><F0A1819C><EFBFBD>霂訫<E99C82>靘?```
### 4. 憭<><EFBFBD>烐綉銝𤾸<E98A9D>霅?
```bash
# <20>券燵<E588B8><EFBFBD><E494B6>烐綉<E78390>滨蔭<E6BBA8>𡃏郎閫<E9838E><E996AB>
# 閫<><E996AB>1嚗𡁜<E59A97>隞賢仃韐亙<E99F90>霅?韏<><E99F8F>嚗鑹DS摰硺<E691B0>
<EFBFBD><EFBFBD><EFBFBD>嚗𡁜<EFBFBD>隞賭遙<EFBFBD>∠𠶖<EFBFBD>?<3F>∩辣嚗𡁜<E59A97>隞賢仃韐?<3F>𡁶䰻嚗𡁻<E59A97><F0A181BB>厩黎 + <20>桐辣
# 閫<><E996AB>2嚗𡁜<E59A97>隞賜征<E8B39C><EFBFBD>頞喳<E9A09E>霅?韏<><E99F8F>嚗鑹DS摰硺<E691B0>
<EFBFBD><EFBFBD><EFBFBD>嚗𡁜<EFBFBD>隞賭蝙<EFBFBD>函征<EFBFBD>?<3F>∩辣嚗?80%
<EFBFBD>𡁶䰻嚗𡁻<EFBFBD>隞?
# 閫<><E996AB>3嚗朞<E59A97>餈?4撠𤩺𧒄<F0A4A9BA><EFBFBD>隞賢<E99A9E>霅?韏<><E99F8F>嚗鑹DS摰硺<E691B0>
<EFBFBD><EFBFBD><EFBFBD>嚗𡁏<EFBFBD><EFBFBD>𤾸<EFBFBD>隞賣𧒄<EFBFBD>?<3F>∩辣嚗?24撠𤩺𧒄
<EFBFBD>𡁶䰻嚗𡁶揮<EFBFBD><EFBFBD><EFBFBD>凋縑+<2B><EFBFBD>嚗?```
---
## <20><>雿喳<E99BBF>頝萎<E9A09D><EFBFBD><EFBFBD><EFBFBD>
### <20>?<3F><>雿喳<E99BBF>頝蛛<E9A09D>11<31><EFBFBD><E28ABF><EFBFBD><E78390><EFBFBD>
#### 1. 餈墧𦻖瘙删恣<E588A0>?
```typescript
// <20>?甇<>嚗𡁜銁 DATABASE_URL 銝剝<E98A9D>蝵株<E89DB5><E6A0AA>仿<EFBFBD><E4BBBF>?DATABASE_URL=postgresql://user:pass@host:5432/db?connection_limit=10&pool_timeout=10
// <20>?甇<>嚗𡁏覔<F0A1818F>娟AE摰硺<E691B0><E7A1BA>啣𢆡<E595A3><F0A286A1>恣蝞?connectionLimit = Math.floor(400 / 20) - 10 = 10
// <20>?<3F>躰秤嚗帋<E59A97><E5B88B>滨蔭餈墧𦻖<E5A2A7>𣂼<EFBFBD><EFBFBD><E59A97><EFBFBD>堒偷RDS餈墧𦻖嚗?DATABASE_URL=postgresql://user:pass@host:5432/db
```
#### 2. 隡㗛<E99AA1><E3979B>喲𡡒
```typescript
// <20>?甇<>嚗𡁶<E59A97><F0A181B6>?SIGTERM 靽∪噡
process.on('SIGTERM', async () => {
await prisma.$disconnect()
process.exit(0)
})
// <20>?<3F>躰秤嚗帋<E59A97><E5B88B>喲𡡒餈墧𦻖嚗𠄎AE蝻拙捆<E68B99><EFBFBD><E59789><EFBFBD>瞍𧶏<E79E8D>
```
#### 3. 鈭见𦛚蝞∠<E89D9E>
```typescript
// <20>?甇<>嚗帋蝙<E5B88B>沌risma鈭见𦛚
await prisma.$transaction(async (tx) => {
await tx.user.create({ data: { email: 'test@example.com' } })
await tx.project.create({ data: { userId: 'xxx', name: 'Test' } })
})
// <20>?<3F>躰秤嚗𡁏<E59A97><F0A1818F>函恣<E587BD><E681A3><EFBFBD><EFBFBD><EFBFBD>摰寞<E691B0>敹䁅扇COMMIT嚗?await prisma.$executeRaw`BEGIN`
// ... 憭帋葵<E5B88B><EFBFBD> ...
await prisma.$executeRaw`COMMIT` // 憒<><E68692>銝剝𡢿<E5899D><EFBFBD>嚗䔶<E59A97>隡𡁜<E99AA1>皛?```
#### 4. Schema<EFBFBD>𠉛
```typescript
// <20>?甇<>嚗䥪risma<6D>芸𢆡頝舐眏<E88890>唳迤蝖桃<E89D96>Schema
await prisma.user.findMany() // <20>芸𢆡霈輸䔮 platform_schema.users
// <20>?甇<>嚗朞楊Schema<6D>亥砭嚗<E7A0AD><E59A97><EFBFBD><EFBFBD>蝟鳴<E89D9F>
await prisma.user.findUnique({
where: { id: 'xxx' },
include: { projects: true } // <20>芸𢆡JOIN aia_schema.projects
})
// <20>?<3F>躰秤嚗𡁏<E59A97><F0A1818F>簒chema<6D>滨妍嚗㇊risma銝齿綫<E9BDBF><EFBFBD>
await prisma.$queryRaw`SELECT * FROM platform_schema.users` // <20>臭誑撌乩<E6928C>嚗䔶<E59A97>蝐餃<E89D90>銝滚<E98A9D><E6BB9A>?```
#### 5. <EFBFBD><EFBFBD>
```sql
-- <20>?甇<>嚗帋蛹憸𤑳<E686B8><F0A491B3>亥砭<E4BAA5><E7A0AD><EFBFBD>畾萄<E795BE>撱箇揣撘?CREATE INDEX idx_users_email ON platform_schema.users(email);
CREATE INDEX idx_projects_user_id ON aia_schema.projects(user_id);
-- <20>?甇<>嚗帋蛹憭㚚睸<E39A9A>𥕦遣蝝<E89D9D>嚗㇊risma銝滩䌊<E6BBA9><EFBFBD>撱綽<E692B1>
CREATE INDEX idx_conversations_project_id ON aia_schema.conversations(project_id);
-- <20>?<3F>躰秤嚗𡁜<E59A97>撱箄<E692B1>憭𡁶揣撘𤏪<E69298>敶勗<E695B6><E58B97><EFBFBD><E59D94><EFBFBD>嚗?-- <20>芯蛹憸𤑳<E686B8><F0A491B3>亥砭<E4BAA5><E7A0AD><EFBFBD>畾萄<E795BE>撱箇揣撘?```
#### 6. <EFBFBD><EFBFBD>
```bash
# <20>?甇<>嚗𡁜<E59A97><F0A1819C><EFBFBD>霂閧㴓憓<E3B493><E68693>霂?# 瘚贝<E7989A><E8B49D><EFBFBD> > 憸<><E686B8><EFBFBD><EFBFBD> > <20>煺漣<E785BA><EFBFBD>
# <20>?甇<>嚗𡁜<E59A97><EFBFBD><E686AD>皛朞<E79A9B><E69C9E>?# 瘥譍葵餈<E891B5><EFBFBD><EFBFBD>撖孵<E69296><E5ADB5><EFBFBD>ollback.sql
# <20>?<3F>躰秤嚗𡁶凒<F0A181B6>亙銁<E4BA99>煺漣<E785BA><EFBFBD><E887AC><EFBFBD><E689AF><EFBFBD>霂閧<E99C82><EFBFBD>
```
#### 7. 憭<>遢撉諹<E69289>
```bash
# <20>?甇<>嚗𡁏<E59A97><EFBFBD><EFBFBD><EFBFBD>瞍𠉛<E79E8D>
# 蝖桐<E89D96><EFBFBD><EFBFBD>舐鍂
# <20>?甇<>嚗𡁻<E59A97><EFBFBD><E996AC>雿𨅯<E99BBF><F0A885AF>见𢆡敹怎<E695B9>
# 憭抒<E686AD><E68A92><EFBFBD>蝥扼<E89DA5><E689BC>chema<6D>䀹凒<E480B9>?
# <20>?<3F>躰秤嚗帋<E59A97>銝漤<E98A9D><EFBFBD><E99C82>隞踝<E99A9E><EFBFBD>遢憭望<E686AD><E69C9B><EFBFBD><E59786>𤑳緵嚗?```
#### 8. <20>烐綉<E78390>𡃏郎
```bash
# <20>?甇<>嚗𡁶<E59A97><F0A181B6><EFBFBD><E689B9><EFBFBD><E6A0BC>?- RDS餈墧𦻖<E5A2A7><EFBFBD><E5A086>𡃏郎<F0A1838F><E9838E><EFBFBD><EFBFBD>80%嚗?- <20>䰻霂<E99C82><EFBD87>𡃏郎<F0A1838F><E9838E><EFBFBD><EFBFBD>>1蝘𡜐<E89D98>
- 甇駁<E79487><EFBFBD><E59A97>霅阡<E99C85><E998A1><EFBFBD>>0嚗?- CPU雿輻鍂<E8BCBB><E98D82><EFBFBD><EFBFBD>𡃏郎<F0A1838F><E9838E><EFBFBD><EFBFBD>>70%嚗?
# <20>?<3F>躰秤嚗帋<E59A97><E5B88B>烐綉嚗<E7B689>䔮憸睃<E686B8><E79D83><EFBFBD><E7AC94><EFBFBD><E6BB9A><EFBFBD>
```
#### 9. 撖<><E69296>蝞∠<E89D9E>
```bash
# <20>?甇<>嚗帋蝙<E5B88B>典撩撖<E692A9><E69296>嚗?6雿?憭批<E686AD><E689B9>?<3F><EFBFBD>+蝚血噡嚗?DATABASE_URL=postgresql://user:Abc123!@#XYZ456@host:5432/db
# <20>?甇<>嚗𡁜<E59A97><F0A1819C>蠘蔭<E8A098><EFBFBD><EFBCB7><EFBFBD><EFBFBD>瘥?銝芣<E98A9D>嚗?
# <20>?<3F>躰秤嚗帋蝙<E5B88B>典摹撖<E691B9><E69296>嚗īostgres/123456嚗?```
#### 10. 蝵𤑳<E89DB5>摰匧<E691B0>
```bash
# <20>?甇<>嚗鑹DS<44><EFBFBD>霈禽PC<50><43><EFBFBD>霈輸䔮
# <20><EFBFBD><E8B3A2><EFBFBD>蝵殷<E89DB5><EFBFBD>◆雿輻鍂VPC蝵烐挾嚗䔶<E59A97><E494B6>賜鍂<E8B39C>閙㦤IP
<EFBFBD><EFBFBD><EFBFBD>閧內靘页<EFBFBD>172.16.0.0/12嚗𠄎AE<41><45>PC蝵烐挾嚗?<3F><EFBFBD><E79195><EFBFBD>嚗锭AE<41><EFBFBD><E689B9>?> 摨𠉛鍂霂行<E99C82> > 蝵𤑳<E89DB5><F0A491B3>滨蔭 > VPC蝵烐挾
# <20>?甇<>嚗帋<E59A97><EFBFBD><E69298><EFBFBD>蝵𤏸挪<F0A48FB8><EFBFBD><E6AEB7><EFBFBD>銝湔𧒄靚<F0A79284><E99D9A>嚗?
# <20>?<3F>躰秤1嚗𡁶蒾<F0A181B6><EFBFBD><E6BB9A>滨蔭 0.0.0.0/0嚗<30><E59A97>銝𣇉<E98A9D><F0A38789>航挪<E888AA><EFBFBD>
# <20>?<3F>躰秤2嚗𡁶蒾<F0A181B6><EFBFBD><E6BB9A>滨蔭<E6BBA8>閙㦤IP 172.16.1.23嚗𠄎AE摰硺<EFBFBD>IP隡𡁜<EFBFBD><EFBFBD><EFBFBD>撖潸稲餈墧𦻖憭梯揖嚗?# <20>?<3F>躰秤3嚗𡁻<E59A97>蝵桀<E89DB5>銝芸<E98A9D><E88AB8>截P嚗<50><EFBFBD>文𤌴<E69687><EFBFBD>銝娍<E98A9D>瘜訫<E7989C>撖酬AE撘寞<E69298><EFBFBD>摰對<E691B0>
```
#### 11. pg-boss銵函恣<E587BD>?
```typescript
// <20>?甇<>嚗帋<E59A97><EFBFBD>銁Prisma Schema銝剖<E98A9D>銋纺g-boss銵?// pg-boss<73>芸𢆡蝞∠<E89D9E>嚗䔶<E59A97><E494B6><EFBFBD><EFBFBD><E996AC>撌亙<E6928C>銋?
// <20>?甇<>嚗帋<E59A97><EFBFBD><E996AC>撌乩耨<E4B9A9>雷g-boss銵?// <20><EFBFBD>撖潸稲隞餃𦛚<E9A483><EFBFBD><EFBFBD>
// <20>?<3F>躰秤嚗𡁜<E59A97><F0A1819C>小g-boss銵?// DROP TABLE platform_schema.job; // 隡𡁜紡<F0A1819C><EFBFBD><E6B8B8>典援皞?```
#### 12. <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>?
```sql
-- <20>?甇<>嚗鑹DS<44>嗅躹<E59785>滨蔭銝?Asia/Shanghai
-- RDS<44><EFBFBD><E689B9>?> <20><>㺭霈曄蔭 > timezone
timezone = Asia/Shanghai
-- <20>?撉諹<E69289><E8ABB9>嗅躹
SHOW timezone;
-- 摨磰砲<E7A3B0>曄內嚗鋫sia/Shanghai
-- <20>?<3F>躰秤嚗帋蝙<E5B88B>沃TC<54>嗅躹嚗<E8BAB9><E59A97>摨𠉛鍂<F0A0899B>嗅躹銝滢<E98A9D><E6BBA2><EFBFBD>
-- <20><EFBFBD>嚗?-- 1. <20><EFBFBD><E4BA99>園𡢿撖嫣<E69296>銝𠺪<E98A9D><F0A0BAAA>滨垢14:00嚗峕㺭<E5B395><EFBFBD>06:00嚗?-- 2. pg-boss摰𡁏𧒄隞餃𦛚<E9A483><EFBFBD>霂舀𧒄<E88880>渲圻<E6B8B2>?-- 3. <20><EFBFBD><E586BD><EFBFBD><E8A781><EFBFBD>𧒄<EFBFBD><EFBFBD><E6B994>躰秤
```
**<EFBFBD>滨蔭甇仿炊嚗?*
```bash
# 甇仿炊1嚗𡁶蒈敶𥵃DS<44><EFBFBD><E689B9>?# <20><EFBFBD>鈭?> 鈭烐㺭<E78390><EFBFBD>RDS > PostgreSQL摰硺<E691B0>
# 甇仿炊2嚗帋耨<E5B88B><EFBFBD><E5ADB5>?# 摰硺<E691B0>霂行<E99C82> > <20><>㺭霈曄蔭 > <20>𦦵揣 "timezone"
# 靽格㺿銝綽<E98A9D>Asia/Shanghai
# 甇仿炊3嚗𡁻<E59A97><F0A181BB><EFBFBD>靘页<E99D98><E9A1B5><EFBFBD>㺭靽格㺿<E6A0BC><E3BABF><EFBFBD><E996AC><EFBFBD><EFBFBD>
# 摰硺<E691B0>霂行<E99C82> > <20>滚鍳摰硺<E691B0>
# 甇仿炊4嚗𡁻<E59A97>霂?psql -h rm-xxxxx.pg.rds.aliyuncs.com -U aiclinical_rw -d ai_clinical_research
SHOW timezone;
# 摨磰砲<E7A3B0>曄內嚗鋫sia/Shanghai
```
**銝𤾸<E98A9D><F0A4BEB8>冽𧒄<E586BD><EFBFBD><E7AE94><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**
```bash
# Node.js<6A>𡒊垢嚗鍃NV TZ=Asia/Shanghai
# Python敺格<E695BA><E6A0BC><EFBFBD>ENV TZ=Asia/Shanghai
# <20>滨垢Nginx嚗鍃NV TZ=Asia/Shanghai
# RDS PostgreSQL嚗魩imezone = Asia/Shanghai
# <20>?<3F><><EFBFBD><EFBFBD><E39787>⊥𧒄<E28AA5><EFBFBD><EFBFBD>嚗屸<E59A97><E5B1B8>齿𧒄<E9BDBF>湔毽銋?```
---
### <20>?蝏嘥笆蝳<E7AC86><EFBFBD><E8BFAB><EFBFBD>雿頣<E99BBF>10<31>∠滯蝥選<E89DA5>
#### <20>麱 1. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD><EFBFBD>銵?`DROP TABLE`
```sql
-- <20>?蝏嘥笆蝳<E7AC86>
DROP TABLE platform_schema.users; -- 銝<EFBCB7><E4BB83><EFBFBD>厩鍂<E58EA9>瑟㺭<E7919F><EFBFBD><E6AEB7><EFBFBD><E4ADBE><EFBFBD>
-- <20>?甇<><EFBFBD>𡁏<EFBFBD>嚗𡁜<E59A97><EFBFBD>遢嚗<E981A2><E59A97><EFBFBD>滚𦶢<E6BB9A><EFBFBD><EFBFBD><E996AB>7憭拙<E686AD><E68B99>𣳇膄
ALTER TABLE platform_schema.users RENAME TO users_deprecated_20251214;
-- 7憭拙<E686AD>蝖株恕<E6A0AA>𣳇䔮憸矋<E686B8><E79F8B><EFBFBD><E6BB9A>?DROP TABLE platform_schema.users_deprecated_20251214;
```
#### <20>麱 2. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><E68693>銵峕𧊋瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>蝘?
```bash
# <20>?蝏嘥笆蝳<E7AC86>
psql -h production-rds -f untested_migration.sql # <20><EFBFBD><E888AA><EFBFBD><E6B8B8>唳旿
# <20>?甇<><EFBFBD>𡁏<EFBFBD>嚗𡁏<E59A97>霂閧㴓憓?> 憸<><E686B8><EFBFBD><EFBFBD> > <20>煺漣<E785BA><EFBFBD>
```
#### <20>麱 3. 蝳<>迫銝滚<E98A9D>隞賢停<E8B3A2><EFBFBD><E689AF>滚之<E6BB9A>䀹凒
```sql
-- <20>?蝏嘥笆蝳<E7AC86>
ALTER TABLE platform_schema.users DROP COLUMN email; -- 瘝⊥<E7989D><EFBFBD>
-- <20>?甇<><EFBFBD>𡁏<EFBFBD>嚗𡁜<E59A97><F0A1819C>𥕦遣敹怎<E695B9>
-- RDS<44><EFBFBD><E689B9>?> 憭<>遢摰硺<E691B0> > <20>𥕦遣憭<E981A3>
-- <20><EFBFBD><E59785>齿<EFBFBD><EFBFBD><E98AB5><EFBFBD>?```
#### <EFBFBD> 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```typescript
// <EFBFBD>?<EFBFBD>
const prisma = new PrismaClient({
datasources: {
db: {
url: 'postgresql://user:password@host:5432/db' // <EFBFBD><EFBFBD>? }
}
})
// <EFBFBD>?<EFBFBD><EFBFBD>𡁏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?const prisma = new PrismaClient({
datasources: {
db: {
url: process.env.DATABASE_URL // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
})
```
#### <20>麱 5. 蝳<>迫銝漤<E98A9D>蝵株<E89DB5><E6A0AA><EFBFBD><E4BAA4>𣂼<EFBFBD>
```bash
# <20>?蝏嘥笆蝳<E7AC86>
DATABASE_URL=postgresql://user:pass@host:5432/db # <20>𣳇<EFBFBD><F0A3B387>?
# <20>?甇<><EFBFBD>𡁏<EFBFBD>
DATABASE_URL=postgresql://user:pass@host:5432/db?connection_limit=10
```
#### <20>麱 6. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD>?`prisma migrate dev`
```bash
# <20>?蝏嘥笆蝳<E7AC86>
npx prisma migrate dev # 隡𡁜<E99AA1><F0A1819C>斗㺭<E69697><EFBFBD>撱?
# <20>?甇<><EFBFBD>𡁏<EFBFBD>
npx prisma migrate deploy # <20><EFBFBD><E88AB8>冽鰵餈<E9B0B5>宏嚗䔶<E59A97><E494B6>𣳇膄<F0A3B387>唳旿
```
#### <20>麱 7. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD>沌risma<6D>?`query` <20><EFBFBD>
```typescript
// <20>?蝏嘥笆蝳<E7AC86>迫嚗<E8BFAB><E59A97>鈭抒㴓憓<E3B493><E68693>
export const prisma = new PrismaClient({
log: ['query', 'info', 'warn', 'error'] // <20><EFBFBD>銝仿<E98A9D>銝钅<E98A9D>
})
// <20>?甇<><EFBFBD>𡁏<EFBFBD><EFBFBD><E59A97>鈭抒㴓憓<E3B493><E68693>
export const prisma = new PrismaClient({
log: process.env.NODE_ENV === 'production' ? ['error'] : ['query', 'info', 'warn', 'error']
})
```
#### <20>麱 8. 蝳<><EFBFBD>见極靽格㺿 `_prisma_migrations` 銵?
```sql
-- <20>?蝏嘥笆蝳<E7AC86>
DELETE FROM _prisma_migrations WHERE migration_name = 'xxx'; -- <20><EFBFBD><EFBFBD><EFBFBD><E5AE8F>
-- <20>?甇<><EFBFBD>𡁏<EFBFBD>嚗𡁜<E59A97><F0A1819C>𡏭<EFBFBD>蝘餃枂<E9A483><EFBFBD><E8BEB7><EFBFBD>撟嗡耨憭?-- 銝滩<E98A9D><E6BBA9>见極靽格㺿 _prisma_migrations
```
#### <20>麱 9. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD><EFBFBD>蝥抒鍂<E68A92><EFBFBD>postgres嚗?
```bash
# <20>?蝏嘥笆蝳<E7AC86>
DATABASE_URL=postgresql://postgres:password@host:5432/db # <20><><EFBFBD><EFBFBD>
# <20>?甇<><EFBFBD>𡁏<EFBFBD>嚗𡁜<E59A97>撱箏<E692B1><E7AE8F><EFBFBD><E585B6>函鍂<E587BD>?CREATE USER aiclinical_rw WITH PASSWORD 'xxx';
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA platform_schema TO aiclinical_rw;
```
#### <20>麱 10. 蝳<><EFBFBD>𣳇膄pg-boss<73><73>
```sql
-- <20>?蝏嘥笆蝳<E7AC86>
DROP TABLE platform_schema.job; -- 摨𠉛鍂蝡见朖撏拇<E6928F>
DROP TABLE platform_schema.queue; -- 隞餃𦛚<E9A483><EFBFBD>憭望<E686AD>
-- <20>?甇<><EFBFBD>𡁏<EFBFBD>嚗𡁏偶餈靝<E9A488><EFBFBD><E996AC>撌交<E6928C>雿𦑩g-boss銵?-- 憒<><E68692><EFBFBD><EFBFBD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>雿輻鍂pg-boss<73><73>PI
```
---
## <20><> <20><EFBFBD>銝𤾸遣霈?
### 1. 雿删<E99BBF><E588A0>唳旿摨梶緵<E6A2B6><EFBFBD><E5A19A>𧼮虜憟踝<E6869F><E8B89D>?
| 蝏游漲 | <20><EFBFBD>?| 霂<><E99C82> |
|------|------|------|
| **Schema<6D>𠉛氖<F0A0899B><EFBFBD>** | <20>?10銝杵chema<6D><EFBFBD>撠曹<E692A0> | 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| **Postgres-Only<6C><EFBFBD>** | <20>?pg-boss甇<73>虜撌乩<E6928C>嚗峕𣈲<E5B395><F0A388B2><EFBFBD>?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| **<EFBFBD>唳旿摰峕㟲<EFBFBD>?* | <20>?憭㚚睸蝥行<E89DA5>摰峕㟲 | 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| **Prisma Schema** | <20>?摰<><E691B0><EFBFBD><EFBFBD>嚗īg-boss銵其<E98AB5><E585B6>芸𢆡<E88AB8>𥕦遣嚗?| 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| **<EFBFBD>唳旿<EFBFBD>?* | <20>?26MB嚗屸<E59A97><E5B1B8><EFBFBD><EFBFBD>宏 | 潃鐥<E6BD83>潃鐥<E6BD83>潃?|
| **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>** | <20>𩤃<EFBFBD> public schema<6D>㗇唂銵剁<E98AB5>擐𡝗活<F0A19D97>函蔡<E587BD><EFBFBD><E693A7><EFBFBD><EFBFBD> | 潃鐥<E6BD83>潃鐥<E6BD83> |
**<EFBFBD><EFBFBD>嚗帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧼮虜隡条<EFBFBD><EFBFBD>虾隞亦凒<EFBFBD>仿<EFBFBD>蝵脣<EFBFBD>RDS嚗?*
### 2. 擐𡝗活<F0A19D97>函蔡<E587BD><EFBFBD><E588BB><EFBFBD>
```
<EFBFBD><EFBFBD> 撘箇<E69298><E7AE87><EFBFBD>嚗䮝g_dump <20><EFBFBD>撖澆<E69296>
<EFBFBD><EFBFBD>眏嚗?<3F>?100%摰峕㟲嚗<E39FB2><E59A97><EFBFBD>殆g-boss銵剁<E98AB5>
<EFBFBD>?蝏𤘪<E89D8F>+<2B>唳旿+蝝<E89D9D>+憭㚚睸銝<E79DB8>甈⊥<E79488><EFBFBD><E689B9>?<3F>?憌𡡞埯雿𠬍<E99BBF><F0A0AC8D><EFBFBD>憭齿<E686AD>銵?<3F>?<3F><EFBFBD>敹恬<E695B9>26MB蝥?0蝘𡜐<E89D98>
<EFBFBD>園𡢿隡啁<EFBFBD>嚗?- 撖澆枂嚗?<3F><><EFBFBD>
- 隡㰘<E99AA1><E3B098>蚩CS嚗?<3F><><EFBFBD>
- 撖澆<E69296>RDS嚗?<3F><><EFBFBD>
- 撉諹<E69289>嚗?<3F><><EFBFBD>
<EFBFBD>餉恣嚗?10<31><30><EFBFBD>
```
### 3. <20>芣䔉<E88AA3>湔鰵<E6B994><EFBFBD><E588BB><EFBFBD>
| <20>湔鰵蝐餃<E89D90> | <20><EFBFBD><E588BB><EFBFBD> | 撌亙<E6928C> |
|---------|---------|------|
| 撠𤩺凒<F0A4A9BA><EFBFBD><E5A086><EFBFBD>摮埈挾嚗?| Prisma Migrate | `npx prisma migrate dev` |
| 銝剜凒<E5899C><EFBFBD><E5A086><EFBFBD>銵剁<E98AB5> | Prisma Migrate | `npx prisma migrate dev` |
| 憭扳凒<E689B3><EFBFBD><E5A086>唳芋<E594B3><EFBFBD> | 蝏𤘪<E89D8F><F0A498AA>𡝗<EFBFBD>蝔?| Prisma + <20>见極SQL + 憭<>遢 |
| 蝝扳<E89D9D>乩耨憭㵪<E686AD>Hotfix嚗?| 敹恍<E695B9><EFBFBD>𡁻<EFBFBD> | <20>湔𦻖SQL嚗<4C><E59A97><EFBFBD>遢嚗?|
### 4. 憭<>遢蝑𣇉裦嚗<E8A3A6><E59A97><EFBFBD><EFBFBD><E6AFBA>𣇉<EFBFBD>嚗?
```
蝚砌<EFBFBD><EFBFBD>㯄俈蝥選<EFBFBD>RDS<EFBFBD>芸𢆡憭<EFBFBD>遢嚗<EFBFBD><EFBFBD><EFBFBD>𡄯<EFBFBD>潃鐥<EFBFBD>潃鐥<EFBFBD>潃?<3F><EFBFBD> <20>唳旿憭<E697BF>遢嚗𡁏<E59A97>憭拙<E686AD><E68B99>?<3F>?<3F><EFBFBD> <20><EFBFBD><EFBFBD>遢嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><E69298>烈ITR嚗?<3F><EFBFBD> 靽萘<E99DBD>7憭?
蝚砌<EFBFBD><EFBFBD>㯄俈蝥選<EFBFBD><EFBFBD>见𢆡敹怎<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡄯<EFBFBD>潃鐥<EFBFBD>潃鐥<EFBFBD>
<EFBFBD><EFBFBD> <20>滚之<E6BB9A><EFBFBD><E6BBA2><EFBFBD>撱?
蝚砌<EFBFBD><EFBFBD>㯄俈蝥選<EFBFBD>pg_dump<EFBFBD>𡁏𧋦嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD> 銝𡁜𦛚<F0A1819C>𡁜之<F0A1819C>𤾸<EFBFBD><F0A4BEB8><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>瞍𠉛<EFBFBD>嚗𡁏<EFBFBD><EFBFBD>漲銝<EFBFBD>甈∴<EFBFBD><EFBFBD><EFBFBD>嚗?```
**<2A><EFBFBD><E884B2><EFBFBD><E88AB7>滨蔭RDS<44>芸𢆡憭<F0A286A1>遢嚗𣬚<E59A97><EFBFBD><E695B9><EFBFBD>𨥈<EFBFBD>**
### 5. 皜<><E79A9C><EFBFBD><EFBFBD><E39B96><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
```sql
-- 撱箄悅<E7AE84><EFBFBD>甈⊿<E79488>蝵脣<E89DB5>RDS<44><EFBFBD><E693A7>?-- 1. 餈<>宏 admin_logs <20>?admin_schema
ALTER TABLE public.admin_logs SET SCHEMA admin_schema;
-- 2. 餈<>宏 review_tasks <20>?rvw_schema
ALTER TABLE public.review_tasks SET SCHEMA rvw_schema;
-- 3. <20>𣳇膄<F0A3B387><EFBFBD><E6BB9A>?public.users嚗<73><E59A97><EFBFBD><E99C82>嚗?-- <20><>笆瘥娍㺭<E5A88D><EFBFBD><E6A190><EFBFBD>?SELECT COUNT(*) FROM public.users;
SELECT COUNT(*) FROM platform_schema.users;
-- 銝<><E98A9D><EFBFBD><E6B8B8>𣳇膄
DROP TABLE public.users;
-- 4. <20>湔鰵Prisma Schema
model AdminLog {
// ...
@@map("admin_logs")
@@schema("admin_schema") // 隞?public <20>嫣蛹 admin_schema
}
model ReviewTask {
// ...
@@map("review_tasks")
@@schema("rvw_schema") // 隞?public <20>嫣蛹 rvw_schema
}
```
### 6. 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
```
<EFBFBD>?1. <20>𥕦遣<F0A595A6><EFBFBD>鈭駵DS PostgreSQL 15摰硺<E691B0>
<EFBFBD>?2. <20>滨蔭VPC<50><43><EFBFBD><EFBFBD><EFBFBD><E59A97>儭讐鍂VPC蝵烐挾嚗剹<E59A97><E589B9><EFBFBD>隞賜<E99A9E><E8B39C><EFBFBD><E4BC90>芸𢆡憭<F0A286A1>遢+<2B><EFBFBD><EFBFBD>遢嚗?<3F>?3. <20>砍𧑐皜<F0A79190><E79A9C>瘚贝<E7989A><E8B49D>唳旿嚗<E697BF><EFBFBD><EFBFBD>
<EFBFBD>?4. pg_dump撖澆枂<E6BE86>唳旿摨?<3F>?5. <20><EFBFBD>ECS頝單踎<E596AE>箏紡<E7AE8F>充DS
<EFBFBD>?6. 撉諹<E69289>撖澆<E69296>蝏𤘪<E89D8F>嚗𠄎chema<6D><61><EFBFBD><E2809D><EFBFBD><EFBFBD><E69FB4>g-boss嚗?<3F>?7. <20>滨蔭SAE<41><EFBFBD><E887AC><EFBFBD>嚗㇄ATABASE_URL嚗?<3F>?8. <20>函蔡backend摨𠉛鍂
<EFBFBD>?9. 蝡臬<E89DA1>蝡舀<E89DA1>霂?<3F>?10. <20>烐綉24撠𤩺𧒄
<EFBFBD><EFBFBD>園𡢿嚗?-4撠𤩺𧒄嚗<F0A79284><E59A97>0<EFBFBD><EFBFBD>蝥選<E89DA5>
```
---
**<EFBFBD><EFBFBD><EFBFBD>𥕦遣鈭綽<EFBFBD>** AI<41><EFBFBD>
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD>** 2025-12-14
**<EFBFBD><EFBFBD>𧋦嚗?* v1.0
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>艙嚗𡁏㺭<EFBFBD><EFBFBD><EFBFBD>函洵銝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞踝<EFBFBD>皜鞱<EFBFBD>撘讛<EFBFBD>蝘鳴<EFBFBD>摰峕㟲撉諹<EFBFBD>** 潃鐥<E6BD83>潃?