Python PostgreSQL 驱动TODO
简介
PostgreSQL 社区为Python 驱动提供了多种选择,在该领域至少有 8 个不同项目。在 Python Wiki 上有一个类似页面。如此多的选择,每种选择都有一组截然不同的权衡取舍,对新手来说非常困扰,最终阻碍了一些 PostgreSQL+Python 的使用。最近,pgsql-hacker 列表上的一份长篇讨论有助于从 PostgreSQL 社区的角度关注该领域的重大问题。
从那次讨论中出现了几个普遍主题,这些主题极大地缩小了值得关注的候选驱动程序列表
- 对于那些最希望在任何纯 Python 实现中支持 Python+PostgreSQL 的人来说,这没什么价值。最好的情况是性能仅为更直接封装 libpq 的那一半或更低。即使是像 psycopg 这样更快的驱动程序的最佳情况也足以造成性能下降。
- 将 Python 2.X 作为目标是一种要求;有 3.X 特性路线图很好;现在只支持 3.X 几乎没有价值。
- 由于社区强烈偏好从 BSD 或 MIT 风格的许可证中产生的更简单的许可证问题,因此使用 GPL 或非标准许可证的项目吸引力较低。
目前,Psycopg 和 PyGreSQL 似乎是与这些目标相匹配的最佳定位的替代方案,但每个都需要大量更改才能完全实现这些目标。
针对 Psycopg 的期望改进
Psycopg 重新获得许可似乎与 PostgreSQL 项目的总体目标最接近,就驱动程序和应用程序端(因为很多应用程序已经使用此驱动程序)所需的编码工作而言。以下是在感知价值方面最重要的未解决问题
- 确认/添加对最常见标准类型(数组、元组、记录)的支持
- Psycopg 具有高度可调的参数映射系统,从Python 对象到 Postgres和Postgres 类型到 Python。所有标准类型都受支持。
- 考虑重构以更好地遵循标准驱动程序做法;特别是使用 PQExecParams 可能会很有帮助。
- 正在就此展开讨论和测试。不幸的是,这会打破与现有应用程序的兼容性(例如,PQExecParams 不支持在单个查询中发送多个语句,这个特性目前由 psycopg 公布;用户定义的类型转换器也可能破坏)。因为很多人在使用 *Params 路径时都看到了价值,所以我们正在寻求解决方案。
- 除非你明确使用服务器端游标,否则即使你使用 fetchone,运行具有大结果集的查询也会导致内存错误,因为 psycopg2 在内部读取了整个结果集。这似乎与大多数其他驱动程序的默认行为有所不同。
在与项目开发者沟通之后,已经解决了几个问题
- 许可证变更。BSD 或 MIT 风格的许可证更为理想。切换到 LGPL 虽然理想程度较低,但仍能带来很大程度的改进,只要解决 OpenSSL 许可证问题 即可(而且 现有许可证 中已包含这样的条款)。
- 许可证已更改 为标准 LGPL3,自 2.0.14 版本的打包版本起生效。
- 添加正式文档页面。PostgreSQL 社区可以在此 wiki 上完成,而不是期待 initd.org 来处理,并且已经在此处启动 Psycopg 文档编制。
- 近期的文件升级 处理了此处的绝大多数顾虑。
- 审核/测试 V2.0 异步更改的实现。
- 异步支持 已审核并测试:版本 2.2 提供了非常坚实的支持。
为 PyGreSQL 所希望的改进
PyGreSQL 甚至比 Python 的 DB-API 更旧,并且其 DB-API 界面似乎不够全面。但它确实有正确的许可证,并且其“经典”pg 界面是 libpq 直接映射,这可能带来一些好处。使它极具吸引力的特性,同样按重要性递减顺序,包括
- 为完全的 DB-API 2.0 支持进行测试/完成/重构。此处的一些问题看起来似乎基于文档,而不是基于代码——不太清楚哪些内容受支持,哪些不受支持。
- 添加某种扩展支持,可能是以 Psycopg 的做法为模型
- 构建一个完整的 COPY 扩展
- 确认/添加对最通用标准类型(数组、元组、记录、timestamp/timestamptz)的支持
- 确认/添加参数化查询支持
- 确认/添加多线程支持
- 研究将 bytea 支持更干净地集成到 DB-API 界面中。它已在经典界面中可用。
- 考虑重构以更好地遵循 标准驱动程序实践
请注意,其中很多都已经列在项目自己的未来方向列表中。
高级功能核对表
数据库中提供了一些功能,或从通常所期望的 Python 应用程序中获得良好性能,这对于构建功能驱动程序并不是必需的,但这会有所帮助。Python DB-API 还有一些遗漏的内容可能会很好
- 优化 COPY 管道以提高 ETL 等操作的速度(如避免冗余内存分配)
- 支持咨询锁
- 添加直接支持已准备的语句
- 结果集游标
- 数据库结构检查
驱动程序应用程序集成
除了基本的数据库包装器外,构建更简单的基于 PostgreSQL 的 Python 应用程序还需要集成到主要的开发框架中
框架 | psycopg | PyGreSQL | pg8000 | bgpsql | py-postgresql |
---|---|---|---|---|---|
SQLAlchemy | 是 | 混合报告 | 0.6 beta | 否 | 没有 3.0 |
Django | 是 | 否 | 否 | 实验性 | 没有 3.0 |
Twisted | 是 | 是 | 否 | 否 | 没有 3.0 |
web2py | 是 | 否 | 是,自 1.99.5+ 起 | 否 | 没有 3.0 |
Peewee | 是 | 否 | 否 | 否 | 没有 3.0 |
让 PostgreSQL 社区围绕单个 Python 驱动程序(或至少是一小套驱动程序)更加统一,似乎更可能将那些首选的驱动程序用作应用程序支持的目标。