Yoru Karu Studio

程式設計學習筆記 | 生活心得

03-3. 非同步資料庫操作 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (進階) 🤔 一句話解釋 非同步資料庫操作讓你在等待資料庫回應時,可以處理其他請求,大幅提升併發效能。 🎯 為什麼需要非同步? 同步 vs 非同步 同步處理(每個請求等待資料庫): Request 1: ████████░░░░░░░░ 等待 DB Request 2: ████████░░░░░░░░ 等待 DB Request 3: ████████░░░░░░░░ 等待 DB 總時間:████████████████████████████████████████ 非同步處理(等待時處理其他請求): Request 1: ██░░░░██ 開始 → 等待 → 完成 Request 2: ██░░░░██ 開始 → 等待 → 完成 Request 3: ██░░░░██ 開始 → 等待 → 完成 總時間:████████████████效能差異 場景 同步 非同步 100 個併發請求 逐一處理 同時處理 I/O 等待時 阻塞 處理其他請求 適合場景 CPU 密集 I/O 密集 📦 安裝 # SQLAlchemy 非同步支援 pip install sqlalchemy[asyncio] # 非同步資料庫驅動 pip install asyncpg # PostgreSQL(推薦) pip install aiomysql # MySQL pip install aiosqlite # SQLite 🔧 基本設定 建立非同步 Engine from sqlalchemy.

03-4. 資料庫遷移 Alembic ⏱️ 閱讀時間: 20 分鐘 🎯 難度: ⭐⭐⭐ (進階) 🤔 一句話解釋 Alembic 是 SQLAlchemy 的資料庫遷移工具,讓你用版本控制的方式管理資料庫 Schema 變更。 🎯 為什麼需要資料庫遷移? 沒有遷移工具的問題 ❌ 直接修改資料庫: - 無法追蹤變更歷史 - 無法在不同環境同步 Schema - 回滾困難 - 團隊協作混亂 ✅ 使用 Alembic: - 版本控制 Schema 變更 - 自動生成遷移腳本 - 支援升級和降級 - 團隊協作順暢遷移流程 修改 Model → 生成遷移腳本 → 審核腳本 → 執行遷移 ↓ ↓ ↓ ↓ class User alembic revision 檢查 SQL alembic upgrade id: int --autogenerate name: str + email: str # 新增欄位 📦 安裝與初始化 安裝 pip install alembic初始化 # 在專案根目錄執行 alembic init alembic # 會產生以下結構: # alembic/ # ├── env.

03-5. Repository 模式 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (進階) 🤔 一句話解釋 Repository 模式將資料存取邏輯封裝成獨立的層,讓業務邏輯不直接依賴資料庫實作。 🎯 為什麼需要 Repository 模式? 沒有 Repository 的問題 # ❌ 業務邏輯直接操作資料庫 @app.post("/users") async def create_user(user_data: UserCreate, db: AsyncSession = Depends(get_db)): # 資料庫查詢散落在各處 stmt = select(User).where(User.email == user_data.email) existing = await db.execute(stmt) if existing.scalar(): raise HTTPException(status_code=400, detail="Email exists") user = User(**user_data.dict()) db.add(user) await db.commit() await db.refresh(user) return user使用 Repository 的好處 ┌─────────────────────────────────────────────────────────┐ │ 分層架構 │ ├─────────────────────────────────────────────────────────┤ │ API Layer → 定義端點、驗證輸入 │ │ ↓ │ │ Service Layer → 業務邏輯 │ │ ↓ │ │ Repository Layer → 資料存取(封裝 SQL) │ │ ↓ │ │ Database → 實際的資料庫 │ └─────────────────────────────────────────────────────────┘優點:

03-6. 交易管理 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (進階) 🤔 一句話解釋 交易(Transaction)確保多個資料庫操作要嘛全部成功,要嘛全部失敗,維持資料的一致性。 🎯 為什麼需要交易管理? 沒有交易的問題 # ❌ 沒有交易保護 async def transfer_money(from_id: int, to_id: int, amount: float): from_user = await get_user(from_id) from_user.balance -= amount await db.commit() # ✅ 扣款成功 # 如果這裡發生錯誤... raise Exception("Network error") to_user = await get_user(to_id) to_user.balance += amount await db.commit() # ❌ 永遠不會執行 # 結果:錢從 A 扣了,但沒有加到 B!使用交易 # ✅ 使用交易保護 async def transfer_money(from_id: int, to_id: int, amount: float): async with db.

03-7. 查詢優化 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (進階) 🤔 一句話解釋 查詢優化是透過索引、載入策略、分頁等技術,讓資料庫查詢更快、更有效率。 🎯 常見效能問題 N+1 查詢問題 # ❌ N+1 問題:1 次查詢使用者 + N 次查詢文章 users = await db.execute(select(User)) for user in users.scalars(): # 每次迴圈都會觸發一次查詢 print(f"{user.username}: {len(user.posts)} posts") # 執行的 SQL: # SELECT * FROM users; # SELECT * FROM posts WHERE user_id = 1; # SELECT * FROM posts WHERE user_id = 2; # SELECT * FROM posts WHERE user_id = 3; # .

03-8. 多資料庫支援 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (進階) 🤔 一句話解釋 多資料庫支援讓你的應用可以同時連接多個資料庫,實現讀寫分離、分庫等架構。 🎯 使用場景 ┌─────────────────────────────────────────────────────────┐ │ 多資料庫場景 │ ├─────────────────────────────────────────────────────────┤ │ 1. 讀寫分離 │ │ ┌────────┐ ┌────────┐ │ │ │ Master │ ──複製──▶│ Slave │ │ │ │ 寫入 │ │ 讀取 │ │ │ └────────┘ └────────┘ │ ├─────────────────────────────────────────────────────────┤ │ 2. 多租戶 │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ DB_A │ │ DB_B │ │ DB_C │ │ │ │租戶 A │ │租戶 B │ │租戶 C │ │ │ └────────┘ └────────┘ └────────┘ │ ├─────────────────────────────────────────────────────────┤ │ 3.
0%