
## 一、SQLite优势及适用场景
1. **数据库地位**：2025年与PostgreSQL并列数据库前二，使用人数最多
2. **场景优势**：
   - 无需安装和设置
   - Pythonic开发方式
   - 性能优秀
   - 适合作为轻量级的数据库

## 二、性能关键：WAL模式
### 1. 并发读写问题
- SQLite默认的"delete"模式不支持并发读写
- 自2010年起支持多进程并发读写，但需启用WAL模式

### 2. WAL模式优势
- **并发支持**：允许多进程同时读写同一数据库
- **性能提升**：所有场景下都能带来性能提升
- **锁机制优化**：
  - 读操作从主库读取稳定数据版，无需加锁
  - 写操作先锁定.wal文件，合并时才短暂锁定主数据库
  - 锁粒度比delete模式更细
- **性能指标**：处理单笔交易耗时<0.1ms，支持每秒至少1万笔交易

### 3. 启用WAL模式
```python
# 原生方式
import sqlite3
conn = sqlite3.connect("path/to/sqlite.db")
conn.execute("PRAGMA journal_mode = WAL;")

# sqlite-utils方式
import sqlite_utils as su
db = su.Database("path/to/sqlite.db")
db.enable_wal()
```

## 三、多线程封装方案
```python
import threading
import sqlite3
import sqlite_utils as su

class TradeDB:
    """线程安全的数据库连接封装"""
    def __init__(self):
        self._thread_local = threading.local()
    
    @property
    def db(self) -> su.Database:
        """获取当前线程的数据库连接"""
        if not hasattr(self._thread_local, "conn"):
            conn = sqlite3.connect(self.db_path, check_same_thread=True)
            self._thread_local.conn = conn
            self._thread_local.db = su.Database(conn)
            if self.db_path != ":memory:":
                self._thread_local.db.enable_wal()
        return self._thread_local.db
```

## 四、sqlite-utils：半ORM解决方案
### 1. 核心优势
- **Pythonic操作**：接近Python语法操作数据库
- **轻量级**：比SQLAlchemy更简洁
- **动态表结构**：无需预定义表结构即可插入数据
- **CLI工具**：提供数据库管理能力

### 2. 基本用法
```python
import sqlite_utils as su

db = su.Database(":memory:")  # 创建内存数据库
db["users"].insert_all([  # 动态创建表并插入数据
    {"id": 1, "name": "Fred"},
    {"id": 2, "name": "Wilma"}
])

print(db.tables)  # 查看所有表
print(db["users"].columns)  # 查看表结构
list(db["users"].rows)  # 获取所有记录
```

## 五、基于dataclass的ORM实现
### 1. 类型映射方案
```python
from dataclasses import dataclass, asdict, fields
from enum import IntEnum
import datetime

@dataclass
class User:
    __table__ = "users"  # 表名
    __pk__ = "id"        # 主键
    __indices__ = (["name"], False)  # 索引
    
    id: int
    name: str
    birth: datetime.date
    gender: IntEnum
    
    def __post_init__(self):
        """类型转换：数据库类型 -> Python类型"""
        if isinstance(self.birth, str):
            self.birth = datetime.date.fromisoformat(self.birth)
        if isinstance(self.gender, int):
            self.gender = Gender(self.gender)

# 使用示例
user = User(id=1, name="Alice", birth=datetime.date(2020,1,1), gender=Gender.FEMALE)
db["users"].insert(asdict(user))
```

### 2. 自动生成表结构
```python
def _dataclass_to_schema(model) -> dict:
    """将dataclass转换为sqlite-utils兼容的schema"""
    schema = {}
    for f in fields(model):
        # 处理基本类型、联合类型、枚举类型
        ...
    return schema
```

## 六、CRUD操作示例
```python
# 插入记录
db["users"].insert(asdict(user))

# 更新或插入
db["users"].upsert(asdict(user), pk="id")

# 查询记录
db["users"].get(1)  # 按主键查询
list(db["users"].rows_where("gender = ?", (Gender.FEMALE,)))  # 条件查询

# 删除记录
db["users"].delete(1)  # 按主键删除
db["users"].delete_where("id = ?", (10,))  # 条件删除

# 转换为DataFrame
pd.DataFrame(db["users"].rows)
```

## 七、高级工具：fastlite
- 在sqlite-utils基础上封装
- 集成dataclass支持
- 提供更简洁的查询语法
- 学习成本低，但需评估是否必要

## 八、最佳实践建议
1. **启用WAL模式**：所有并发读写场景都应启用
2. **线程安全**：使用线程本地存储管理数据库连接
3. **类型安全**：推荐使用dataclass显式定义数据结构
4. **工具选择**：
   - 探索性分析：直接使用sqlite-utils
   - 生产环境：使用dataclass + sqlite-utils组合
   - 追求极致简洁：考虑fastlite

## 九、性能对比
| 特性 | SQLite(WAL模式) | PostgreSQL |
|------|-----------------|------------|
| 并发支持 | 多进程读写 | MVCC技术 |
| 锁粒度 | 较细 | 更精细 |
| 延迟 | 无网络延迟 | 有网络延迟 |
| 适用场景 | 本地、轻量级 | 高并发、分布式 |

---

