Files
xiaoxia-saas/docs/DATABASE-SWITCH.md
2026-06-21 11:29:33 +08:00

216 lines
4.0 KiB
Markdown
Raw Permalink 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.
# 数据库切换指南
## 📚 概述
小虾 SaaS 支持两种数据存储方式:
1. **InMemory(内存数据库)** - 开发和测试环境
2. **PostgreSQL** - 生产环境
通过环境变量 `USE_IN_MEMORY_DB` 控制。
---
## 🔄 快速切换
### 方式 1: 环境变量
`.env` 文件中设置:
```env
# 使用内存数据库(开发/测试)
USE_IN_MEMORY_DB=true
# 使用 PostgreSQL(生产)
USE_IN_MEMORY_DB=false
DATABASE_URL=postgresql://user:pass@localhost:5432/xiaoxia_saas
```
### 方式 2: 启动时指定
```bash
# 使用内存数据库
USE_IN_MEMORY_DB=true uvicorn apps.api.main:app --reload
# 使用 PostgreSQL
USE_IN_MEMORY_DB=false uvicorn apps.api.main:app --reload
```
---
## 💡 InMemory 数据库
**特点:**
- ✅ 无需安装 PostgreSQL
- ✅ 无需数据库迁移
- ✅ 快速启动
- ✅ 适合开发和测试
- ❌ 重启后数据丢失
- ❌ 不适合生产环境
**使用场景:**
- 本地开发
- 单元测试
- 集成测试
- 快速原型验证
**启动:**
```bash
# 设置环境变量
export USE_IN_MEMORY_DB=true
# 启动服务
uvicorn apps.api.main:app --reload
```
---
## 🗄️ PostgreSQL 数据库
**特点:**
- ✅ 数据持久化
- ✅ 支持事务
- ✅ 生产就绪
- ✅ 支持并发
- ❌ 需要安装 PostgreSQL
- ❌ 需要运行数据库迁移
**使用场景:**
- 生产环境
- 预发布环境
- 需要数据持久化的场景
**设置步骤:**
1. **安装 PostgreSQL**
```bash
# Ubuntu
sudo apt-get install postgresql
# macOS
brew install postgresql
```
2. **创建数据库**
```bash
sudo -u postgres psql
CREATE DATABASE xiaoxia_saas;
CREATE USER xiaoxia_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE xiaoxia_saas TO xiaoxia_user;
\q
```
3. **运行 Alembic 迁移**
```bash
alembic upgrade head
```
4. **配置环境变量**
```env
USE_IN_MEMORY_DB=false
DATABASE_URL=postgresql://xiaoxia_user:password@localhost:5432/xiaoxia_saas
```
5. **启动服务**
```bash
uvicorn apps.api.main:app --reload
```
---
## 🐳 Docker 环境
### Canonical Docker Compose(自动配置 PostgreSQL
```bash
# 自动启动 PostgreSQL 和应用
WEB_PORT=3001 docker compose -f infra/docker/compose.yml up -d --build
# 查看日志
docker compose -f infra/docker/compose.yml logs -f api
```
`infra/docker/compose.yml` 是当前唯一有效 compose 入口;根目录 `docker-compose.yml` 已退役。
---
## 🧪 测试环境
### 单元测试(推荐 InMemory
```python
# tests/conftest.py
import os
os.environ['USE_IN_MEMORY_DB'] = 'true'
```
### 集成测试(可选 PostgreSQL
```bash
# 使用 PostgreSQL 进行集成测试
USE_IN_MEMORY_DB=false pytest tests/integration -v
```
---
## 🔧 实现原理
依赖注入容器根据配置自动选择:
```python
# apps/api/app/dependencies.py
@property
def user_repository(self):
if settings.USE_IN_MEMORY_DB:
return InMemoryUserRepository()
else:
return PostgresUserRepository(settings.DATABASE_URL)
```
**优点:**
- 业务逻辑无需改动
- 切换透明
- 测试隔离
---
## ⚠️ 注意事项
1. **数据不兼容**
- InMemory 和 PostgreSQL 之间无法直接迁移数据
- 切换前请备份重要数据
2. **性能差异**
- InMemory 更快(无 I/O
- PostgreSQL 支持更大数据量
3. **并发支持**
- InMemory 不支持多进程
- PostgreSQL 支持多进程和集群
4. **环境一致性**
- 开发环境建议使用 InMemory
- 生产环境必须使用 PostgreSQL
---
## 🚀 最佳实践
1. **开发流程**
```
开发(InMemory → 测试(InMemory → 预发布(PostgreSQL → 生产(PostgreSQL
```
2. **配置管理**
- 使用 `.env` 文件管理配置
- 不要提交 `.env` 到版本控制
- 使用 `.env.example` 作为模板
3. **数据库迁移**
- 所有 schema 变更都要有迁移脚本
- 迁移脚本要幂等(可多次执行)
- 测试迁移脚本后再应用到生产
---
**最后更新:** 2026-06-17