181 lines
3.6 KiB
Markdown
181 lines
3.6 KiB
Markdown
|
|
# 数据库模型使用说明
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
数据库模型位于 `src/models/database.py`,使用 SQLAlchemy ORM 实现。
|
|||
|
|
|
|||
|
|
## 主要组件
|
|||
|
|
|
|||
|
|
### 1. Record 模型
|
|||
|
|
|
|||
|
|
数据库表结构,包含以下字段:
|
|||
|
|
|
|||
|
|
| 字段名 | 类型 | 说明 |
|
|||
|
|
|--------|------|------|
|
|||
|
|
| id | Integer | 主键,自增 |
|
|||
|
|
| image_path | String(512) | 图片路径,唯一索引 |
|
|||
|
|
| ocr_text | Text | OCR识别结果 |
|
|||
|
|
| category | String(20) | 分类类型 |
|
|||
|
|
| ai_result | Text | AI生成的Markdown |
|
|||
|
|
| tags | JSON | 标签列表 |
|
|||
|
|
| notes | Text | 用户备注 |
|
|||
|
|
| created_at | DateTime | 创建时间 |
|
|||
|
|
| updated_at | DateTime | 更新时间 |
|
|||
|
|
|
|||
|
|
### 2. RecordCategory 类
|
|||
|
|
|
|||
|
|
定义了支持的分类常量:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
RecordCategory.TODO # 待办事项
|
|||
|
|
RecordCategory.NOTE # 笔记
|
|||
|
|
RecordCategory.IDEA # 灵感
|
|||
|
|
RecordCategory.REF # 参考资料
|
|||
|
|
RecordCategory.FUNNY # 搞笑文案
|
|||
|
|
RecordCategory.TEXT # 纯文本
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. DatabaseManager 类
|
|||
|
|
|
|||
|
|
数据库连接管理器,负责:
|
|||
|
|
- 创建数据库引擎
|
|||
|
|
- 管理会话工厂
|
|||
|
|
- 初始化表结构
|
|||
|
|
|
|||
|
|
### 4. 便捷函数
|
|||
|
|
|
|||
|
|
- `init_database(db_path)`: 初始化数据库
|
|||
|
|
- `get_db()`: 获取数据库会话
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
### 初始化数据库
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from src.models import init_database
|
|||
|
|
|
|||
|
|
# 使用默认路径
|
|||
|
|
db_manager = init_database()
|
|||
|
|
|
|||
|
|
# 指定自定义路径
|
|||
|
|
db_manager = init_database("sqlite:////path/to/database.db")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 创建记录
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from src.models import get_db, Record, RecordCategory
|
|||
|
|
|
|||
|
|
session = get_db()
|
|||
|
|
|
|||
|
|
# 创建新记录
|
|||
|
|
record = Record(
|
|||
|
|
image_path="/path/to/image.png",
|
|||
|
|
ocr_text="识别的文本",
|
|||
|
|
category=RecordCategory.NOTE,
|
|||
|
|
ai_result="# AI内容",
|
|||
|
|
tags=["标签1", "标签2"],
|
|||
|
|
notes="用户备注"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
session.add(record)
|
|||
|
|
session.commit()
|
|||
|
|
print(f"新记录ID: {record.id}")
|
|||
|
|
session.close()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查询记录
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from src.models import get_db, Record, RecordCategory
|
|||
|
|
|
|||
|
|
session = get_db()
|
|||
|
|
|
|||
|
|
# 查询所有记录
|
|||
|
|
all_records = session.query(Record).all()
|
|||
|
|
|
|||
|
|
# 按分类查询
|
|||
|
|
notes = session.query(Record).filter_by(category=RecordCategory.NOTE).all()
|
|||
|
|
|
|||
|
|
# 按ID查询
|
|||
|
|
record = session.query(Record).filter_by(id=1).first()
|
|||
|
|
|
|||
|
|
# 模糊搜索
|
|||
|
|
results = session.query(Record).filter(
|
|||
|
|
Record.ocr_text.contains("关键词")
|
|||
|
|
).all()
|
|||
|
|
|
|||
|
|
session.close()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 更新记录
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from src.models import get_db, Record
|
|||
|
|
|
|||
|
|
session = get_db()
|
|||
|
|
record = session.query(Record).filter_by(id=1).first()
|
|||
|
|
|
|||
|
|
# 更新字段
|
|||
|
|
record.notes = "新的备注"
|
|||
|
|
record.ai_result = "# 更新后的AI内容"
|
|||
|
|
|
|||
|
|
# 使用标签方法
|
|||
|
|
record.add_tag("新标签")
|
|||
|
|
record.update_tags(["标签A", "标签B"])
|
|||
|
|
|
|||
|
|
session.commit()
|
|||
|
|
session.close()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 删除记录
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from src.models import get_db, Record
|
|||
|
|
|
|||
|
|
session = get_db()
|
|||
|
|
record = session.query(Record).filter_by(id=1).first()
|
|||
|
|
|
|||
|
|
session.delete(record)
|
|||
|
|
session.commit()
|
|||
|
|
session.close()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 转换为字典
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from src.models import get_db, Record
|
|||
|
|
|
|||
|
|
session = get_db()
|
|||
|
|
record = session.query(Record).first()
|
|||
|
|
|
|||
|
|
# 转换为字典格式
|
|||
|
|
data = record.to_dict()
|
|||
|
|
print(data)
|
|||
|
|
# {'id': 1, 'image_path': '/path/to/image.png', ...}
|
|||
|
|
|
|||
|
|
session.close()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **会话管理**: 使用完session后记得关闭,或使用上下文管理器
|
|||
|
|
2. **时间戳**: `created_at` 和 `updated_at` 自动管理
|
|||
|
|
3. **分类验证**: 使用 `RecordCategory.is_valid(category)` 验证分类
|
|||
|
|
4. **JSON字段**: tags 字段是JSON类型,存储为列表
|
|||
|
|
|
|||
|
|
## 数据库文件位置
|
|||
|
|
|
|||
|
|
默认数据库文件路径:
|
|||
|
|
```
|
|||
|
|
/home/congsh/CodeSpace/ClaudeSpace/CutThenThink/data/cutnthink.db
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 测试
|
|||
|
|
|
|||
|
|
运行测试脚本验证数据库功能(需要先安装SQLAlchemy):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
python3 tests/test_database.py
|
|||
|
|
```
|