跳转至

SQLAlchemy CouchDB 方言

SQLAlchemy Logo

功能强大的 SQLAlchemy 2.0+ CouchDB 驱动

Python Version SQLAlchemy Version License Tests


✨ 项目特性

🎯 Phase 1: 纯 CouchDB 模式 ✅ 已完成

核心功能

  • 完整的 SQLAlchemy 支持: 实现 SQLAlchemy 2.0+ Dialect 接口
  • 同步 + 异步: 100%支持同步和异步操作(greenlet机制)
  • SQL → Mango Query: 自动将 SQL 转换为 CouchDB Mango Query
  • 类型系统: 完整的 Python ↔ JSON 类型映射
  • 基于 httpx: 高性能 HTTP 客户端,支持连接池
  • 完整测试: 487项测试通过,80% 代码覆盖率
  • 自动索引管理: ORDER BY 操作自动创建所需索引
  • 参数绑定: 正确处理 SQLAlchemy 2.0 的 BindParameter 机制
  • 异步并发: 支持 asyncio.gather() 并发查询

🚧 Phase 2: 混合数据库架构 ⏳ 已实现

混合架构功能

  • 智能查询路由: 简单查询 → CouchDB,复杂查询 → 关系型数据库
  • 双写同步: 自动同步数据到 CouchDB 和关系型数据库
  • 通用数据库支持: 支持 PostgreSQL, MySQL, SQLite 等
  • 字段映射: 自动处理 CouchDB 特殊字段(_id, _rev, type
  • 最终一致性: 后台监控和自动修复数据差异

🚀 快速开始

安装

pip install sqlalchemy-couchdb

基本使用

from sqlalchemy import create_engine, text

# 创建引擎
engine = create_engine('couchdb://admin:password@localhost:5984/mydb')

# 使用连接
with engine.connect() as conn:
    # 插入数据
    conn.execute(text("""
        INSERT INTO users (name, age, email)
        VALUES (:name, :age, :email)
    """), {"name": "Alice", "age": 30, "email": "alice@example.com"})

    # 查询数据
    result = conn.execute(text("SELECT * FROM users WHERE age > :age"), {"age": 25})
    for row in result:
        print(f"{row.name}: {row.age}")

    conn.commit()
import asyncio
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy import text

async def main():
    # 创建异步引擎
    engine = create_async_engine('couchdb+async://admin:password@localhost:5984/mydb')

    async with engine.connect() as conn:
        # 插入数据
        await conn.execute(text("""
            INSERT INTO users (name, age, email)
            VALUES (:name, :age, :email)
        """), {"name": "Bob", "age": 25, "email": "bob@example.com"})

        # 查询数据
        result = await conn.execute(text("SELECT * FROM users WHERE age > :age"), {"age": 20})

        # 注意:使用同步迭代(结果已在 execute 时缓存)
        for row in result:
            print(f"{row.name}: {row.age}")

        await conn.commit()

    await engine.dispose()

asyncio.run(main())

📊 支持的 SQL 特性

Phase 1 (纯 CouchDB)

SQL 特性 支持情况 说明
SELECT ✅ 部分支持 简单查询,无 JOIN
INSERT ✅ 完全支持 单条和批量插入
UPDATE ✅ 完全支持 需要 _rev
DELETE ✅ 完全支持 需要 _rev
WHERE ✅ 完全支持 支持 =, >, <, IN, LIKE, AND, OR
LIMIT / OFFSET ✅ 完全支持 分页查询
ORDER BY ✅ 完全支持 自动创建索引
JOIN ❌ 不支持 CouchDB 限制
GROUP BY ⚠️ 部分支持 使用客户端聚合
UNION ❌ 不支持
子查询 ❌ 不支持

Phase 2 (混合模式)

通过智能路由,复杂查询自动转发到关系型数据库:

  • JOIN, GROUP BY, HAVING → 路由到关系型数据库
  • 子查询, CTE, 窗口函数 → 路由到关系型数据库
  • ✅ 保留 CouchDB 简单查询的性能优势

🧪 测试状态

测试结果: ✅ 99.8% 通过率 (487/488)

测试类别 通过/总数 状态
编译器测试 100%
同步测试 100%
异步测试 100%
集成测试 100%
代码覆盖率 80% 🎉

📚 文档导航

新手入门

用户指南

API 参考


🎯 特性亮点

批量插入优化

from sqlalchemy import insert

# 批量插入(3-10x 性能提升)
users = [
    {"name": "User1", "age": 25},
    {"name": "User2", "age": 30},
    # ... 更多数据
]

with engine.connect() as conn:
    conn.execute(insert(users_table), users)
    conn.commit()

查询缓存

from sqlalchemy_couchdb.cache import QueryCache

# 启用查询缓存
cache = QueryCache(max_size=1000, ttl=300)

# 缓存会自动处理
result = conn.execute(query)  # 第一次:查询数据库
result = conn.execute(query)  # 第二次:从缓存读取

智能路由(Phase 2)

# 自动路由
engine = create_engine(
    'couchdb+hybrid://admin:password@localhost:5984/mydb'
    '?secondary_db=postgresql://user:pass@localhost/pgdb'
)

# 简单查询 → CouchDB(快)
result = conn.execute("SELECT * FROM users WHERE age > 25")

# 复杂查询 → PostgreSQL(功能完整)
result = conn.execute("""
    SELECT u.name, COUNT(o.id) as order_count
    FROM users u
    JOIN orders o ON u.id = o.user_id
    GROUP BY u.name
""")

🔗 快速链接


📄 许可证

本项目采用 MIT 许可证


⭐ 如果觉得有用,请给我们一个 Star!