You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python是否有类似ADO.NET的数据库通用Cursor/Connection协议?

Python中的数据库通用接口方案

核心基础:Python DB API 2.0规范

Python本身有一套Python DB API 2.0的标准规范,oracledb、pyodbc这类主流数据库驱动都是严格遵循这个规范实现的。这意味着它们的Cursor对象都会提供统一的核心方法,比如execute()、fetchone()、fetchall()等。所以你的查询函数完全不需要指定具体的oracledb.cursor.Cursor或pyodbc.Cursor类型,只要接收符合DB API 2.0标准的Cursor实例就行,底层驱动的差异会被这个规范抹平。

类型标注:用PEP 544协议实现类型提示

如果需要给函数参数做类型标注(又不想逐个写具体的Cursor类型),可以用PEP 544引入的Protocol协议类,自己定义一个符合DB API 2.0的Cursor协议。所有实现了协议中方法的Cursor对象,都会被类型检查工具识别为合法参数。

举个例子:

from typing import Protocol, Iterable, Any

# 定义符合DB API 2.0的Cursor协议
class DBCursor(Protocol):
    def execute(self, sql: str, params: Iterable[Any] | None = ...) -> Any: ...
    def fetchone(self) -> tuple[Any, ...] | None: ...
    def fetchall(self) -> list[tuple[Any, ...]]: ...
    # 按需添加你用到的其他方法,比如fetchmany、close等

然后你的查询函数就可以用这个协议作为参数类型:

def run_query(cursor: DBCursor) -> list[tuple[Any, ...]]:
    cursor.execute("SELECT * FROM some_table")
    return cursor.fetchall()

这样不管是oracledb还是pyodbc的Cursor,只要实现了协议里的方法,都能无缝传入这个函数,完美实现数据库无关的代码逻辑。

进阶选择:通用数据库抽象库

如果觉得自己定义协议太麻烦,也可以用现成的抽象库来简化操作:

  • SQLAlchemy Core:提供了更高层的抽象,不仅能统一Cursor操作,还能自动处理不同数据库的SQL语法差异,底层依然兼容DB API 2.0驱动。
  • Dataset:基于SQLAlchemy的轻量级库,封装了更简洁的表操作接口,适合快速开发场景。

不过如果只是需要简单的Cursor通用处理,直接依赖DB API 2.0的隐式接口,或者自定义PEP 544协议就完全够用了。

内容的提问来源于stack exchange,提问作者zmbq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:42:50