145 lines
4.0 KiB
Plaintext
145 lines
4.0 KiB
Plaintext
# Alembic 数据库迁移指南
|
||
|
||
本项目支持 **PostgreSQL** 和 **SQLite** 两种数据库,使用独立的 Alembic 配置管理迁移。
|
||
|
||
## 📁 目录结构
|
||
|
||
```
|
||
backend/
|
||
├── alembic-postgres.ini # PostgreSQL 配置文件
|
||
├── alembic-sqlite.ini # SQLite 配置文件
|
||
├── alembic/
|
||
│ ├── postgres/ # PostgreSQL 迁移脚本目录
|
||
│ │ ├── env.py
|
||
│ │ ├── script.py.mako
|
||
│ │ └── versions/ # PostgreSQL 迁移版本
|
||
│ │ ├── 20251226_1008_ee0a189f1532_初始数据库结构.py
|
||
│ │ └── 20251226_1102_e411428f00c0_初始化预置数据.py
|
||
│ └── sqlite/ # SQLite 迁移脚本目录
|
||
│ ├── env.py
|
||
│ ├── script.py.mako
|
||
│ └── versions/ # SQLite 迁移版本
|
||
│ └── 20251226_1322_fbeb1038c728_初始化sqlite数据库.py
|
||
```
|
||
|
||
## 🚀 使用方法
|
||
|
||
### 1. PostgreSQL 数据库
|
||
|
||
#### 配置环境变量
|
||
```bash
|
||
# .env 文件
|
||
DATABASE_URL=postgresql+asyncpg://username:password@localhost:5432/database_name
|
||
```
|
||
|
||
#### 生成迁移脚本
|
||
```bash
|
||
cd backend
|
||
alembic -c alembic-postgres.ini revision --autogenerate -m "描述信息"
|
||
```
|
||
|
||
#### 应用迁移
|
||
```bash
|
||
alembic -c alembic-postgres.ini upgrade head
|
||
```
|
||
|
||
#### 回退迁移
|
||
```bash
|
||
alembic -c alembic-postgres.ini downgrade -1
|
||
```
|
||
|
||
#### 查看迁移历史
|
||
```bash
|
||
alembic -c alembic-postgres.ini history
|
||
alembic -c alembic-postgres.ini current
|
||
```
|
||
|
||
### 2. SQLite 数据库
|
||
|
||
#### 配置环境变量
|
||
```bash
|
||
# .env 文件
|
||
DATABASE_URL=sqlite+aiosqlite:///./data/mumulingsi.db
|
||
```
|
||
|
||
#### 生成迁移脚本
|
||
```bash
|
||
cd backend
|
||
alembic -c alembic-sqlite.ini revision --autogenerate -m "描述信息"
|
||
```
|
||
|
||
#### 应用迁移
|
||
```bash
|
||
alembic -c alembic-sqlite.ini upgrade head
|
||
```
|
||
|
||
#### 回退迁移
|
||
```bash
|
||
alembic -c alembic-sqlite.ini downgrade -1
|
||
```
|
||
|
||
#### 查看迁移历史
|
||
```bash
|
||
alembic -c alembic-sqlite.ini history
|
||
alembic -c alembic-sqlite.ini current
|
||
```
|
||
|
||
## ⚙️ 关键配置差异
|
||
|
||
### PostgreSQL (alembic/postgres/env.py)
|
||
- `render_as_batch=False` - 直接支持 ALTER TABLE
|
||
- 使用 `server_default=sa.text('now()')`
|
||
|
||
### SQLite (alembic/sqlite/env.py)
|
||
- `render_as_batch=True` - 通过重建表实现 ALTER TABLE
|
||
- 使用 `server_default=sa.text('(CURRENT_TIMESTAMP)')` - SQLite 格式
|
||
|
||
## 📝 注意事项
|
||
|
||
### SQLite 限制
|
||
1. **并发写入**:同时只允许一个写操作
|
||
2. **ALTER TABLE 限制**:某些操作需要重建表(Alembic 的批处理模式会自动处理)
|
||
3. **类型映射**:
|
||
- `JSON` → `TEXT` (SQLAlchemy 自动处理)
|
||
- `BOOLEAN` → `INTEGER` (0/1)
|
||
- `DEFAULT now()` → `DEFAULT CURRENT_TIMESTAMP`
|
||
|
||
### PostgreSQL 优势
|
||
1. **高并发支持**:多用户同时读写
|
||
2. **完整的 ALTER TABLE 支持**
|
||
3. **高级特性**:全文搜索、JSON 操作符、数组类型等
|
||
|
||
## 🔄 切换数据库
|
||
|
||
只需修改 `.env` 文件中的 `DATABASE_URL`,然后使用对应的配置文件执行迁移:
|
||
|
||
```bash
|
||
# 切换到 SQLite
|
||
DATABASE_URL=sqlite+aiosqlite:///./data/mumulingsi.db
|
||
alembic -c alembic-sqlite.ini upgrade head
|
||
|
||
# 切换到 PostgreSQL
|
||
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/db
|
||
alembic -c alembic-postgres.ini upgrade head
|
||
```
|
||
|
||
## 💡 最佳实践
|
||
|
||
1. **开发环境**:使用 SQLite(简单、无需额外服务)
|
||
2. **生产环境**:使用 PostgreSQL(性能、并发、稳定性)
|
||
3. **保持同步**:两个数据库的模型定义必须一致
|
||
4. **测试迁移**:在两种数据库上都测试迁移脚本
|
||
|
||
## 🐛 常见问题
|
||
|
||
### Q: 迁移脚本生成后可以通用吗?
|
||
A: 不行。PostgreSQL 和 SQLite 的迁移脚本是独立的,因为:
|
||
- SQL 语法差异(如 DEFAULT 值)
|
||
- 类型差异(如 JSON、BOOLEAN)
|
||
- ALTER TABLE 能力差异
|
||
|
||
### Q: 如何从 PostgreSQL 迁移数据到 SQLite?
|
||
A: 需要编写数据导出/导入脚本,不能直接复用迁移脚本。
|
||
|
||
### Q: 为什么 SQLite 迁移这么慢?
|
||
A: SQLite 的 ALTER TABLE 限制导致需要重建表,这在大表时会很慢。 |