Files
Task_Reporter/openspec/changes/archive/2025-12-07-migrate-sqlite-to-mysql/specs/database/spec.md
egg 92834dbe0e feat: Migrate to MySQL and add unified environment configuration
## Database Migration (SQLite → MySQL)
- Add Alembic migration framework
- Add 'tr_' prefix to all tables to avoid conflicts in shared database
- Remove SQLite support, use MySQL exclusively
- Add pymysql driver dependency
- Change ad_token column to Text type for long JWT tokens

## Unified Environment Configuration
- Centralize all hardcoded settings to environment variables
- Backend: Extend Settings class in app/core/config.py
- Frontend: Use Vite environment variables (import.meta.env)
- Docker: Move credentials to environment variables
- Update .env.example files with comprehensive documentation

## Test Organization
- Move root-level test files to tests/ directory:
  - test_chat_room.py → tests/test_chat_room.py
  - test_websocket.py → tests/test_websocket.py
  - test_realtime_implementation.py → tests/test_realtime_implementation.py
- Fix path references in test_realtime_implementation.py

Breaking Changes:
- CORS now requires explicit origins (no more wildcard)
- All database tables renamed with 'tr_' prefix
- SQLite no longer supported

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 14:15:11 +08:00

3.3 KiB
Raw Blame History

ADDED Requirements

Requirement: MySQL Database Support

系統 SHALL 使用 MySQL 作為唯一的資料庫後端,不再支援 SQLite。

MySQL 連線配置:

環境變數 格式 說明
DATABASE_URL mysql+pymysql://user:pass@host:port/database MySQL 連線字串

Scenario: MySQL 連線成功

  • WHEN 提供有效的 MySQL 連線字串
  • THEN 系統 SHALL 成功連線到 MySQL 資料庫

Scenario: MySQL 連線失敗

  • WHEN MySQL 伺服器無法連線
  • THEN 系統 SHALL 顯示明確的連線錯誤訊息並拒絕啟動

Requirement: Table Prefix Convention

所有資料表 SHALL 使用 tr_ 前綴以避免與同資料庫中的其他專案發生命名衝突。

資料表命名規則:

  • 所有資料表名稱以 tr_ 開頭
  • 所有索引名稱以 ix_tr_ 開頭
  • 所有唯一約束名稱以 uq_tr_ 開頭

完整資料表清單:

模組 資料表名稱
Auth tr_users, tr_user_sessions
Chat Room tr_incident_rooms, tr_room_members, tr_room_templates
Realtime tr_messages, tr_message_reactions, tr_message_edit_history
Report tr_generated_reports
File Storage tr_room_files

Scenario: 資料表前綴驗證

  • WHEN 查詢資料庫中由本系統建立的資料表
  • THEN 所有資料表名稱 SHALL 以 tr_ 開頭

Scenario: 索引前綴驗證

  • WHEN 查詢資料庫中由本系統建立的索引
  • THEN 所有索引名稱 SHALL 以 ix_tr_ 開頭

Requirement: Alembic Database Migration

系統 SHALL 使用 Alembic 進行資料庫結構版本控制和遷移管理。

Alembic 配置要求:

  • 從環境變數 DATABASE_URL 讀取資料庫連線
  • 遷移腳本存放於 alembic/versions/ 目錄
  • 支援 alembic upgrade headalembic downgrade 指令

Scenario: 執行資料庫遷移

  • WHEN 執行 alembic upgrade head
  • THEN 系統 SHALL 建立所有 tr_ 前綴的資料表

Scenario: 自動產生遷移腳本

  • WHEN 執行 alembic revision --autogenerate
  • THEN Alembic SHALL 比對 models 與資料庫結構並產生遷移腳本

Scenario: 遷移腳本隔離

  • WHEN 執行任何 Alembic 遷移操作
  • THEN 只有 tr_ 前綴的資料表會受到影響,其他專案的資料表不受影響

Requirement: MySQL Connection Pooling

系統 SHALL 使用連線池管理 MySQL 連線以提升效能和穩定性。

連線池配置:

參數 預設值 說明
pool_size 5 連線池大小
max_overflow 10 最大額外連線數
pool_recycle 3600 連線回收時間(秒)

Scenario: 連線池運作

  • WHEN 多個 API 請求同時存取資料庫
  • THEN 系統 SHALL 從連線池取得連線而非每次建立新連線

Scenario: 連線回收

  • WHEN 連線閒置超過 pool_recycle 時間
  • THEN 系統 SHALL 自動回收並建立新連線以避免 MySQL 的 wait_timeout 問題

REMOVED Requirements

Requirement: SQLite Support

Reason: 專案已完全遷移至 MySQL不再需要 SQLite 支援 Migration:

  • 移除 app/core/database.py 中的 SQLite 特殊處理(check_same_thread
  • 更新 .env.example 移除 SQLite 連線範例
  • 現有 SQLite 資料需手動遷移或重新建立