Python PostgreSQL 驱动TODO

来自 PostgreSQL Wiki
跳转到导航跳转到搜索

简介

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 项目的总体目标最接近,就驱动程序和应用程序端(因为很多应用程序已经使用此驱动程序)所需的编码工作而言。以下是在感知价值方面最重要的未解决问题

  • 确认/添加对最常见标准类型(数组、元组、记录)的支持
  • 考虑重构以更好地遵循标准驱动程序做法;特别是使用 PQExecParams 可能会很有帮助。
    • 正在就此展开讨论和测试。不幸的是,这会打破与现有应用程序的兼容性(例如,PQExecParams 不支持在单个查询中发送多个语句,这个特性目前由 psycopg 公布;用户定义的类型转换器也可能破坏)。因为很多人在使用 *Params 路径时都看到了价值,所以我们正在寻求解决方案。
  • 除非你明确使用服务器端游标,否则即使你使用 fetchone,运行具有大结果集的查询也会导致内存错误,因为 psycopg2 在内部读取了整个结果集。这似乎与大多数其他驱动程序的默认行为有所不同。

在与项目开发者沟通之后,已经解决了几个问题

  • 许可证变更。BSD 或 MIT 风格的许可证更为理想。切换到 LGPL 虽然理想程度较低,但仍能带来很大程度的改进,只要解决 OpenSSL 许可证问题 即可(而且 现有许可证 中已包含这样的条款)。
  • 添加正式文档页面。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 驱动程序(或至少是一小套驱动程序)更加统一,似乎更可能将那些首选的驱动程序用作应用程序支持的目标。