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

40 KiB
Raw Blame History

PostgreSQL 15 <20>唳旿摨㯄<E691A8>蝵脩<E89DB5><E884A9>?- <20><EFBFBD><E8A9A8><EFBFBD>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗? v1.1
*<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗? 2025-12-14
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD><EFBFBD> 2025-12-14
<EFBFBD>唳旿摨梶<EFBFBD><EFBFBD>穿<EFBFBD> PostgreSQL 15.14 (Docker: postgres:15-alpine)
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗? <20><EFBFBD>鈭?RDS PostgreSQL 15
*<EFBFBD><EFBFBD>蝐餃<EFBFBD>嚗? <20><><EFBFBD>舀𨰫摨?+ <20>函蔡蝑𣇉裦


<EFBFBD><EFBFBD> <20><>𧋦靽株恥霈啣<E99C88>

v1.1 (2025-12-14) - 銝㮖<E98A9D>撱箄悅靽格迤<E6A0BC>?

*靽格迤閬<EFBFBD><EFBFBD>嚗?

  1. <EFBFBD>?pg-boss銵?<3F><EFBFBD>"<22><EFBFBD><EFBFBD><E79E89>

    • 靽格迤嚗䮝g-boss隡𡁜銁摨𠉛鍂<F0A0899B>臬𢆡<E887AC>嗉䌊<E59789><EFBFBD>撱箄”嚗<E2809D>蘨閬<E898A8><E996AC><EFBFBD>𣂼<EFBFBD>
    • <EFBFBD><EFBFBD>銝仿<EFBFBD><EFBFBD><EFBFBD>隞?銝仿<E98A9D>撌桀<E6928C><E6A180>?<3F>嫣蛹"<22><EFBFBD><E88AA3><EFBFBD><E7AE8F><EFBFBD><EFBFBD><EFBFBD>𣳇<EFBFBD><F0A3B387><EFBFBD><EFBFBD>嚗?
    • 憓𧼮<EFBFBD>霂湔<EFBFBD>嚗䮝g-boss<73><73><EFBFBD>質䌊<E8B3AA><E48C8A><EFBFBD><EFBFBD>𥕦<EFBFBD><F0A595A6><EFBFBD><EFBFBD><EFBFBD><E996AC>
  2. *<EFBFBD>?<3F><EFBFBD><E8B3A2><EFBFBD>蝵桀撩<E6A180>𤥁秩<F0A4A581>?

    • <EFBFBD><EFBFBD>嚗𡁜<EFBFBD>憿颱蝙<EFBFBD>汲PC蝵烐挾嚗䔶<EFBFBD><EFBFBD>賜鍂<EFBFBD>閙㦤IP
    • 蝷箔<EFBFBD>嚗?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>

    • 靽格迤嚗𡁜<EFBFBD><EFBFBD>笔蘨<EFBFBD><EFBFBD>RDS<EFBFBD>芸𢆡憭<EFBFBD>遢嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>遢嚗? - <20>滨漣嚗䮝g_dump ECS<43>𡁏𧋦隞?蝚砌<E89D9A><E7A08C>㯄俈蝥?<3F>滢蛹"<22><EFBFBD><EFBFBD>銝𡁜𦛚<F0A1819C>𡁜之<F0A1819C>𤾸<EFBFBD><F0A4BEB8><EFBFBD><EFBFBD>嚗?
    • <EFBFBD><EFBFBD>眏嚗鑹DS<EFBFBD>芸𢆡憭<EFBFBD>遢+PITR撌脰雲憭<E99BB2><E686AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
    • 靽萘<EFBFBD>嚗朞<EFBFBD><EFBFBD>祉內靘衤<EFBFBD>銝箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>釣"<22>𩤃<EFBFBD><><E99A9E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝漤<E98A9D>閬?

韐∠讃<EFBFBD><EFBFBD><EFBFBD> 憿寧𤌍<E5AFA7><F0A48C8D><EFBFBD>臬𣪧<E887AC><EFBFBD>擐?


<EFBFBD><EFBFBD> <20><EFBFBD>

  1. [<5B>砍𧑐<E7A08D>唳旿摨梶<E691A8>摰墧<E691B0><E5A2A7>琶(#<23>砍𧑐<E7A08D>唳旿摨梶<E691A8>摰墧<E691B0><E5A2A7>?
  2. [Prisma銝擧㺭<E693A7><EFBFBD><E6A180><EFBFBD>榆撘<E6A686><E69298><EFBFBD>𨚼(#prisma銝擧㺭<E693A7><EFBFBD><E6A180><EFBFBD>榆撘<E6A686><E69298><EFBFBD>?
  3. [隞<><E99A9E><EFBFBD><E68692>餈墧𦻖<E5A2A7>唳旿摨𨩇(#隞<><E99A9E><EFBFBD><E68692>餈墧𦻖<E5A2A7>唳旿摨?
  4. 擐𡝗活<EFBFBD>函蔡<EFBFBD><EFBFBD>
  5. <EFBFBD>芣䔉<EFBFBD>湔鰵蝑𣇉裦
  6. RDS憭<EFBFBD>遢蝑𣇉裦
  7. <EFBFBD><EFBFBD>雿喳<EFBFBD>頝萎<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

<EFBFBD>砍𧑐<EFBFBD>唳旿摨梶<EFBFBD>摰墧<EFBFBD><EFBFBD>?

1. <20><EFBFBD>靽⊥<E99DBD>

Docker<EFBFBD>𨅯<EFBFBD>嚗䮝ostgres:15-alpine
<0A>唳旿摨枏<E691A8>蝘堆<E89D98>ai_clinical_research
餈墧𦻖靽⊥<E99DBD>嚗䮝ostgresql://postgres:postgres@localhost:5432/ai_clinical_research
<0A>唳旿摨枏之撠𧶏<E692A0>26 MB嚗<42><E59A97>霂?撘<><E69298>𤑳㴓憓<E3B493><E68693>
<0A><EFBFBD><E586BD>唳旿嚗?銝芰鍂<E88AB0>瑁揭<E79181>?```

### 2. Schema<6D>𠉛氖<F0A0899B><EFBFBD>嚗?0銝杵chema嚗争<E59A97>

雿删<E99BBF><E588A0>唳旿摨枏歇蝏𤩺<E89D8F><F0A4A9BA><EFBFBD><E7AC94><EFBFBD>10銝杵chema<6D>𠉛氖<F0A0899B><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> <0A>?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>𧋦銵?```

<EFBFBD>𩤃<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>
<0A>?conversations             - 憿寧𤌍撖寡<E69296>
<0A>?messages                  - 撖寡<E69296><EFBFBD><E798A8>
<0A>?general_conversations     - <20>𡁶鍂撖寡<E69296>
<0A>?general_messages          - <20>𡁶鍂瘨<E98D82><E798A8>

3.3 pkb_schema嚗?銝芾”嚗?

<EFBFBD>?knowledge_bases    - <20><EFBFBD>摨橒<E691A8>2<EFBFBD>∟扇敶𤏪<E695B6>
<0A>?documents          - <20><><0A>?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>
<0A>?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>
<0A>𩤃<EFBFBD> admin_logs          - 蝞∠<E89D9E><E288A0><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD>
<0A>𩤃<EFBFBD> review_tasks        - 摰⊥䰻隞餃𦛚嚗?32 KB嚗屸<E59A97><E5B1B8><EFBFBD>
<0A>𩤃<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>撌亙僕憸?```

**敶勗<E695B6><EFBFBD>摯嚗?*
- <20>?**餈鞱<E9A488><E99EB1>園妟敶勗<E695B6>**嚗䮝g-boss<73>芸楛蝞∠<E89D9E>餈嗘<E9A488>銵剁<E98AB5>銝漤<E98A9D><EFBFBD>Prisma霈輸䔮
- <20>?**擐𡝗活<F0A19D97>函蔡<E587BD>芸𢆡<E88AB8>𥕦遣**嚗鑹DS<44>函蔡<E587BD><EFBFBD>backend<6E>臬𢆡隡朞䌊<E69C9E><EFBFBD>撱箄<E692B1>6銝芾”
- <20>𩤃<EFBFBD> **Prisma db pull隡𡁏<E99AA1>瘚见<E7989A>**嚗𡁏<E59A97>銵?`npx prisma db pull` <20><EFBFBD><E597A1>𤑳緵"<22><EFBFBD>銋厩<E98A8B>銵?嚗<>虾敹賜裦嚗?- <20>𩤃<EFBFBD> **Prisma migrate銝齿<E98A9D>雿?*嚗朞<E59A97>蝘颱<E89D98>隡𡁜<E99AA1>甇亥<E79487>鈭𥡝”嚗<E2809D><E59A97><EFBFBD>舀迤蝖桃<E89D96>嚗?
**<2A><>雿喳<E99BBF>頝蛛<E9A09D>**
```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>? *敶勗<EFBFBD>嚗?

  • <EFBFBD>𩤃<EFBFBD> <20>唳旿銝滢<E98A9D><E6BBA2><EFBFBD><E6B9A7><EFBFBD><EFBFBD><E68692><EFBFBD><E99A9E>霂航粉 public.users嚗?- <20>𩤃<EFBFBD> 瘛瑟<E7989B><EFBFBD>舅銝?users 銵剁<E98AB5>
  • <EFBFBD>𩤃<EFBFBD> 蝛粹𡢿瘚芾晶嚗<E699B6><E59A97>憭齿㺭<E9BDBF><EFBFBD>

*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?

-- 甇仿炊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摰帋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? 摰鮋<EFBFBD><EFBFBD>唳旿摨栞” <EFBFBD><EFBFBD>?
platform_schema 2銝迎<EFBFBD>AppCache, User嚗? 8銝迎<EFBFBD>+6銝況g-boss<73>芸𢆡蝞∠<E89D9E>嚗? <EFBFBD>?甇<>虜嚗īg-boss<73><EFBFBD>嚗?
aia_schema 5銝? 5銝? <EFBFBD>?銝<><E98A9D>?
pkb_schema 5銝? 5銝? <EFBFBD>?銝<><E98A9D>?
asl_schema 6銝? 6銝? <EFBFBD>?銝<><E98A9D>?
dc_schema 6銝? 6銝? <EFBFBD>?銝<><E98A9D>?
public 2銝迎<EFBFBD>AdminLog, ReviewTask嚗? 4銝迎<EFBFBD>+_prisma_migrations, users嚗? <EFBFBD>𩤃<EFBFBD> <20><><EFBFBD><E79A9C>

*蝏栞捏嚗?

  • <EFBFBD>?**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>

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈墧𦻖<EFBFBD>唳旿摨?

1. <20><EFBFBD><E887AC><EFBFBD><E3979B>滨蔭

1.1 暺䁅恕餈墧𦻖摮㛖泵銝莎<E98A9D>env.ts嚗?

// AIclinicalresearch/backend/src/config/env.ts (line 50)
databaseUrl: process.env.DATABASE_URL || 'postgresql://postgres:postgres@localhost:5432/ai_clinical'

*<EFBFBD>𩤃<EFBFBD> 瘜冽<E7989C>嚗?

  • 暺䁅恕<EFBFBD>潭糓 ai_clinical<EFBFBD><EFBFBD>摮睃銁嚗?- 摰鮋<E691B0><E9AE8B>唳旿摨枏<E691A8><E69E8F>?ai_clinical_research
  • 霂湔<EFBFBD>雿删<EFBFBD> .env <20><>辣銝剖歇蝏𤩺迤蝖桅<E89D96>蝵桐<E89DB5> DATABASE_URL

1.2 餈墧𦻖瘙𣳇<E79899>蝵殷<E89DB5>database.ts嚗?

// 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>

*鈭穃<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝑𣇉裦嚗?

DATABASE_URL=postgresql://user:pass@host:5432/db?connection_limit=10&pool_timeout=10

2. 餈墧𦻖<E5A2A7><EFBFBD>

餈墧𦻖<EFBFBD><EFBFBD> <EFBFBD>砍𧑐撘<EFBFBD><EFBFBD>? <EFBFBD><EFBFBD>鈭騌AE
銝餅㦤 localhost RDS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> rm-xxxxx.pg.rds.aliyuncs.com嚗?
蝡臬藁 5432 5432
*<EFBFBD>唳旿摨? ai_clinical_research ai_clinical_research嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*<EFBFBD><EFBFBD><EFBFBD>? postgres <EFBFBD><EFBFBD>銋㚁<EFBFBD>憒?aiclinical_rw嚗?
<EFBFBD><EFBFBD> postgres 撘箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>RDS<EFBFBD>𥕦遣<EFBFBD>嗉挽蝵殷<EFBFBD>
餈墧𦻖<EFBFBD>𣂼<EFBFBD> <EFBFBD>𣳇<EFBFBD><EFBFBD>? connection_limit=10嚗𠄎AE瘥誩<E798A5>靘页<E99D98>
餈墧𦻖頞<EFBFBD>𧒄 暺䁅恕 pool_timeout=10

3. 憭锭chema霈輸䔮嚗㇊risma嚗?

// 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>
}

*<EFBFBD><EFBFBD>銝剔<EFBFBD>雿輻鍂嚗?

// <20>芸𢆡頝舐眏<E88890>唳迤蝖桃<E89D96>Schema
await prisma.user.findMany()  // 霈輸䔮 platform_schema.users
await prisma.project.findMany()  // 霈輸䔮 aia_schema.projects

4. <20><EFBFBD>SQL霈輸䔮嚗<E494AE>楊Schema嚗?

// <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>

// 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>?

擐𡝗活<EFBFBD>函蔡<EFBFBD><EFBFBD>

<EFBFBD><EFBFBD>撖寞<EFBFBD>

<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 隡条<EFBFBD> 蝻箇<EFBFBD> <EFBFBD><EFBFBD>摨?
<EFBFBD><EFBFBD>A pg_dump <20><EFBFBD>撖澆<E69296> <EFBFBD>?100%摰峕㟲嚗<E39FB2><E59A97><EFBFBD>殆g-boss銵剁<E98AB5>
<EFBFBD>?蝏𤘪<E89D8F>+<2B>唳旿+蝝<E89D9D>+憭㚚睸
<EFBFBD>?銝<>甈⊥<E79488><EFBFBD><E689B9>?
<EFBFBD>?<3F><><EFBFBD><E996AC>撌交<E6928C><E4BAA4><EFBFBD><EFBFBD>霂閙㺭<E99699>?br><3E>?<3F><><EFBFBD><EFBFBD><E39B96><EFBFBD>ublic銵? 潃鐥<EFBFBD>潃鐥<EFBFBD>潃?撘箇<EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>B Prisma Migrate Deploy <EFBFBD>?<3F><>𧋦<EFBFBD>𣇉恣<F0A38789>?br><3E>?<3F><EFBFBD>憭齿<E686AD>銵? <EFBFBD>?蝻箏<E89DBB>pg-boss銵剁<E98AB5>餈鞱<E9A488><E99EB1><EFBFBD><E597A1>仿<EFBFBD>嚗?br><3E>?<3F><><EFBFBD><E996AC>撌亥<E4BAA5>? <EFBFBD>𩤃<EFBFBD> **銝齿綫<E9BDBF>?*嚗<><E59A97>摰峕㟲嚗?
<EFBFBD><EFBFBD>C <EFBFBD>见極SQL<EFBFBD>𡁏𧋦 <EFBFBD>?摰<><E691B0><EFBFBD>舀綉 <EFBFBD>?撌乩<E6928C><E4B9A9>誩之
<EFBFBD>?摰寞<E691B0><E5AF9E><EFBFBD>
<EFBFBD>𩤃<EFBFBD> **銝齿綫<E9BDBF>?*嚗<><EFBFBD>嗉晶<E59789>𨥈<EFBFBD>

潃?<3F><EFBFBD><E588BB><EFBFBD>A嚗䮝g_dump<6D><EFBFBD>撖澆<E69296><EFBFBD>祕蝏<E7A595>郊撉歹<E69289>

甇仿炊1嚗𡁏𧋦<EFBFBD>唳㺭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

# 憒<><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嚗𡁜紡<EFBFBD>箸㺭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>唳旿嚗?

# 摰峕㟲撖澆枂嚗<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><>聢嚗鬏ds.pg.s2.large嚗?<3F>?GB嚗<42><E59A97><EFBFBD>函漣嚗?摮睃<E691AE>嚗?00GB SSD嚗<44>𣈲<EFBFBD><F0A388B2><EFBFBD><EFBFBD>摰對<E691B0>
<0A><>𧋦嚗䥪ostgreSQL 15
蝵𤑳<E89DB5>嚗间PC嚗<43><E59A97>SAE<41><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嚗𡁜紡<EFBFBD><EFBFBD>RDS

# <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嚗𡁻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?

-- 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嚗𡁻<EFBFBD>蝵娟AE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>

# <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嚗𡁜<EFBFBD><EFBFBD>典鍳<EFBFBD><EFBFBD>霂?

// 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>

# <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';

*銝箔<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>典鍳<EFBFBD>典𦶢隞支葉<EFBFBD><EFBFBD> prisma migrate deploy嚗?

  1. 撟嗅<EFBFBD>憌𡡞埯嚗锭AE<EFBFBD><EFBFBD>銝芸<EFBFBD>靘页<EFBFBD><EFBFBD><EFBFBD><EFBFBD>峕𧒄<EFBFBD><EFBFBD><EFBFBD>
  2. <EFBFBD><EFBFBD><EFBFBD>圈𠗕嚗𡁜<EFBFBD><EFBFBD>𡏭<EFBFBD>蝘餃仃韐伐<EFBFBD>摨𠉛鍂撌脩<EFBFBD><EFBFBD>臬𢆡
  3. **<2A>唳旿摰匧<E691B0>**嚗𡁶<E59A97>鈭扳㺭<E689B3><EFBFBD>摨磰砲<E7A3B0>见極餈<E6A5B5>宏嚗峕<E59A97><EFBFBD><EFBFBD><E981A2><EFBFBD>皛朞恣<E69C9E>?

<EFBFBD>箸艶2嚗𡁏鰵憓硺<EFBFBD>銝芸之璅<EFBFBD><EFBFBD><EFBFBD>SSA<EFBFBD><EFBFBD>蝏蠘恣<EFBFBD><EFBFBD><EFBFBD>嚗?

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗𡁶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>宏瘚<EFBFBD><EFBFBD>

# 甇仿炊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

<EFBFBD>箸艶3嚗𡁶揮<EFBFBD>乩耨憭㵪<EFBFBD>Hotfix嚗?

# 蝷箔<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憭<EFBFBD>遢蝑𣇉裦

1. <20><EFBFBD>鈭駵DS<44>芸𢆡憭<F0A286A1>遢嚗<E981A2><EFBFBD><E692A9><EFBFBD><EFBFBD><E7909C>?

1.1 <20>滨蔭<E6BBA8>芸𢆡憭<F0A286A1>

# <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>

*隡睃飵嚗?

  • <EFBFBD>?<3F>刻䌊<E588BB><EFBFBD><E58981>𣳇<EFBFBD>鈭箏極撟脤<E6929F>
  • <EFBFBD>?<3F>園𡢿<E59C92><EFBFBD>憭㵪<E686AD>Point-in-Time Recovery嚗釶ITR嚗㚁<E59A97><E39A81><EFBFBD>憭滚<E686AD>隞餅<E99A9E>蝘?- <20>?摮睃<E691AE><E79D83>汰SS嚗𣬚𡠺蝡衤<E89DA1>RDS摰硺<E691B0>
  • <EFBFBD>?<3F>滩晶嚗?憭拙<E686AD>嚗?

1.2 <20>见𢆡敹怎<E695B9><EFBFBD><E59A97><EFBFBD><E996AC>雿𨅯<E99BBF>嚗?

# <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>嚗𡁶<E59A97><F0A181B6><EFBFBD><EFBFBD>隞?憭<>釣嚗饢igration_before_ssa_module_20251214

*敹怎<EFBFBD>靽萘<EFBFBD>撱箄悅嚗?

  • <EFBFBD><EFBFBD>滚翰<EFBFBD><EFBFBD>靽萘<EFBFBD>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>嚗?

<EFBFBD>𩤃<EFBFBD> <20><EFBFBD>撱箄悅嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD>䌊撌勗<E6928C><E58B97>𡁏𧋦嚗朙DS<44>芸𢆡憭<F0A286A1>遢撠勗<E692A0><EFBFBD><E988AD>

<EFBFBD>嗆挾 <EFBFBD>遢蝑𣇉裦 <EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>?<3F>芰鍂RDS<44>芸𢆡憭<F0A286A1> - <20>芸𢆡憭<F0A286A1>遢+<2B><EFBFBD><EFBFBD>遢=PITR嚗<52><EFBFBD>𤩺𧒄<F0A4A9BA><EFBFBD><E6B8A1><EFBFBD>嚗?br>- <20><EFBFBD>鈭烐<E988AD>蝞∴<E89D9E>蝔喳<E89D94><E596B3><EFBFBD>
- <20>𣳇<EFBFBD>蝏湔擪<E6B994>𡁏𧋦<F0A1818F>袏CS
*<EFBFBD>鞾鵭<EFBFBD>? <EFBFBD><EFBFBD><EFBFBD>憓𧼮<EFBFBD><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>? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銋匧<EFBFBD>隞? - <20><><EFBFBD>鸌畾𠰴<E795BE>隞賜<E99A9E><E8B39C><EFBFBD><EFBFBD><E68692>撠𤩺𧒄憭<F0A79284>遢嚗?br>- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E78DA2>憒?撟湛<E6929F>

<EFBFBD><EFBFBD><EFBFBD>芣䔉<EFBFBD><EFBFBD><EFBFBD>䌊摰帋<EFBFBD><EFBFBD>遢嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>穿<EFBFBD>

# <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>

# <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>
<0A><><EFBFBD>嚗𡁜<E59A97>隞賭遙<E8B3AD>∠𠶖<E288A0>?<3F>∩辣嚗𡁜<E59A97>隞賢仃韐?<3F>𡁶䰻嚗𡁻<E59A97><F0A181BB>厩黎 + <20>桐辣

# 閫<><E996AB>2嚗𡁜<E59A97>隞賜征<E8B39C><EFBFBD>頞喳<E9A09E>霅?韏<><E99F8F>嚗鑹DS摰硺<E691B0>
<0A><><EFBFBD>嚗𡁜<E59A97>隞賭蝙<E8B3AD>函征<E587BD>?<3F>∩辣嚗?80%
<0A>𡁶䰻嚗𡁻<E59A97>隞?
# 閫<><E996AB>3嚗朞<E59A97>餈?4撠𤩺𧒄<F0A4A9BA><EFBFBD>隞賢<E99A9E>霅?韏<><E99F8F>嚗鑹DS摰硺<E691B0>
<0A><><EFBFBD>嚗𡁏<E59A97><F0A1818F>𤾸<EFBFBD>隞賣𧒄<E8B3A3>?<3F>∩辣嚗?24撠𤩺𧒄
<0A>𡁶䰻嚗𡁶揮<F0A181B6><EFBFBD><E4BC90>凋縑+<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>喲𡡒

// <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>

// <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>

# <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>

# <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
<0A><EFBFBD><E8B3A2>閧內靘页<E99D98>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>?

// <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>滨蔭甇仿炊嚗?

# 甇仿炊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

銝𤾸<EFBFBD><EFBFBD>冽𧒄<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

# 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;

<EFBFBD>麱 2. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><E68693>銵峕𧊋瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>蝘?

# <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>

<EFBFBD>麱 3. 蝳<>迫銝滚<E98A9D>隞賢停<E8B3A2><EFBFBD><E689AF>滚之<E6BB9A>䀹凒

-- <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>
    }
  }
})

<EFBFBD>麱 5. 蝳<>迫銝漤<E98A9D>蝵株<E89DB5><E6A0AA><EFBFBD><E4BAA4>𣂼<EFBFBD>

# <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

<EFBFBD>麱 6. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD>?prisma migrate dev

# <20>?蝏嘥笆蝳<E7AC86>
npx prisma migrate dev  # 隡𡁜<E99AA1><F0A1819C>斗㺭<E69697><EFBFBD>撱?
# <20>?甇<><EFBFBD>𡁏<EFBFBD>
npx prisma migrate deploy  # <20><EFBFBD><E88AB8>冽鰵餈<E9B0B5>宏嚗䔶<E59A97><E494B6>𣳇膄<F0A3B387>唳旿

<EFBFBD>麱 7. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD>沌risma<6D>?query <20><EFBFBD>

// <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']
})

<EFBFBD>麱 8. 蝳<><EFBFBD>见極靽格㺿 _prisma_migrations 銵?

-- <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

<EFBFBD>麱 9. 蝳<><EFBFBD><EFBFBD>鈭抒㴓憓<E3B493><EFBFBD><EFBFBD>蝥抒鍂<E68A92><EFBFBD>postgres嚗?

# <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;

<EFBFBD>麱 10. 蝳<><EFBFBD>𣳇膄pg-boss<73><73>

-- <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

<EFBFBD><EFBFBD> <20><EFBFBD>銝𤾸遣霈?

1. 雿删<E99BBF><E588A0>唳旿摨梶緵<E6A2B6><EFBFBD><E5A19A>𧼮虜憟踝<E6869F><E8B89D>?

蝏游漲 <EFBFBD><EFBFBD>? <EFBFBD><EFBFBD>
Schema<EFBFBD>𠉛氖<EFBFBD><EFBFBD> <EFBFBD>?10銝杵chema<6D><EFBFBD>撠曹<E692A0> 潃鐥<EFBFBD>潃鐥<EFBFBD>潃?
Postgres-Only<6C><EFBFBD> <EFBFBD>?pg-boss甇<73>虜撌乩<E6928C>嚗峕𣈲<E5B395><F0A388B2><EFBFBD>? 潃鐥<EFBFBD>潃鐥<EFBFBD>潃?
*<EFBFBD>唳旿摰峕㟲<EFBFBD>? <EFBFBD>?憭㚚睸蝥行<E89DA5>摰峕㟲 潃鐥<EFBFBD>潃鐥<EFBFBD>潃?
Prisma Schema <EFBFBD>?摰<><E691B0><EFBFBD><EFBFBD>嚗īg-boss銵其<E98AB5><E585B6>芸𢆡<E88AB8>𥕦遣嚗? 潃鐥<EFBFBD>潃鐥<EFBFBD>潃?
*<EFBFBD>唳旿<EFBFBD>? <EFBFBD>?26MB嚗屸<E59A97><E5B1B8><EFBFBD><EFBFBD> 潃鐥<EFBFBD>潃鐥<EFBFBD>潃?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>𩤃<EFBFBD> public schema<6D>㗇唂銵剁<E98AB5>擐𡝗活<F0A19D97>函蔡<E587BD><EFBFBD><E693A7><EFBFBD><EFBFBD> 潃鐥<EFBFBD>潃鐥<EFBFBD>

*<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>

<0A><>眏嚗?<3F>?100%摰峕㟲嚗<E39FB2><E59A97><EFBFBD>殆g-boss銵剁<E98AB5>
<0A>?蝏𤘪<E89D8F>+<2B>唳旿+蝝<E89D9D>+憭㚚睸銝<E79DB8>甈⊥<E79488><EFBFBD><E689B9>?<3F>?憌𡡞埯雿𠬍<E99BBF><F0A0AC8D><EFBFBD>憭齿<E686AD>銵?<3F>?<3F><EFBFBD>敹恬<E695B9>26MB蝥?0蝘𡜐<E89D98>

<0A>園𡢿隡啁<E99AA1>嚗?- 撖澆枂嚗?<3F><><EFBFBD>
- 隡㰘<E99AA1><E3B098>蚩CS嚗?<3F><><EFBFBD>
- 撖澆<E69296>RDS嚗?<3F><><EFBFBD>
- 撉諹<E69289>嚗?<3F><><EFBFBD>
<0A>餉恣嚗?10<31><30><EFBFBD>

3. <20>芣䔉<E88AA3>湔鰵<E6B994><EFBFBD><E588BB><EFBFBD>

<EFBFBD>湔鰵蝐餃<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 撌亙<EFBFBD>
撠𤩺凒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮埈挾嚗? Prisma Migrate npx prisma migrate dev
銝剜凒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵剁<EFBFBD> Prisma Migrate npx prisma migrate dev
憭扳凒<EFBFBD><EFBFBD><EFBFBD>唳芋<EFBFBD><EFBFBD> 蝏𤘪<EFBFBD><EFBFBD>𡝗<EFBFBD>蝔? Prisma + <20>见極SQL + 憭<>
蝝扳<EFBFBD>乩耨憭㵪<EFBFBD>Hotfix嚗? 敹恍<EFBFBD><EFBFBD>𡁻<EFBFBD> <EFBFBD>湔𦻖SQL嚗<EFBFBD><EFBFBD><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憭?
蝚砌<E89D9A><E7A08C>㯄俈蝥選<E89DA5><E981B8>见𢆡敹怎<E695B9><EFBFBD><E59A97><EFBFBD>𡄯<EFBFBD>潃鐥<E6BD83>潃鐥<E6BD83>
<0A><EFBFBD> <20>滚之<E6BB9A><EFBFBD><E6BBA2><EFBFBD>撱?
蝚砌<E89D9A><E7A08C>㯄俈蝥選<E89DA5>pg_dump<6D>𡁏𧋦嚗<F0A78BA6><E59A97><EFBFBD><EFBFBD><E785BA><EFBFBD><EFBFBD><E996AC>
<0A><EFBFBD> 銝𡁜𦛚<F0A1819C>𡁜之<F0A1819C>𤾸<EFBFBD><F0A4BEB8><EFBFBD><EFBFBD>

<0A><EFBFBD>瞍𠉛<E79E8D>嚗𡁏<E59A97><EFBFBD>漲銝<E6BCB2>甈∴<E79488><EFBFBD><E695B9>嚗?```

**<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>
<0A>?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>
<0A>?4. pg_dump撖澆枂<E6BE86>唳旿摨?<3F>?5. <20><EFBFBD>ECS頝單踎<E596AE>箏紡<E7AE8F>充DS
<0A>?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摨𠉛鍂
<0A>?9. 蝡臬<E89DA1>蝡舀<E89DA1>霂?<3F>?10. <20>烐綉24撠𤩺𧒄

憸<><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>潃?