PEP 249 – Python 数据库 API 规范 v2.0
- 作者:
- Marc-André Lemburg <mal at lemburg.com>
- 讨论至:
- Db-SIG 列表
- 状态:
- 最终版
- 类型:
- 信息性
- 创建日期:
- 1999年4月12日
- 发布历史:
- 取代:
- 248
引言
定义此 API 旨在鼓励用于访问数据库的 Python 模块之间保持相似性。通过这样做,我们希望实现一致性,从而产生更易于理解的模块,代码在数据库之间更具可移植性,并从 Python 获得更广泛的数据库连接性。
有关此规范的评论和问题可发送至 Python 数据库接口 SIG。
有关 Python 数据库接口和可用包的更多信息,请参阅数据库主题指南。
本文档描述了 Python 数据库 API 规范 2.0 和一组常见的可选扩展。之前的 1.0 版本仍可作为参考,详见 PEP 248。鼓励包作者将此版本规范作为新接口的基础。
模块接口
构造函数
通过连接对象提供数据库访问。模块必须提供以下构造函数来创建这些对象
- connect( parameters… )
- 用于创建数据库连接的构造函数。
返回一个Connection对象。它接受一些数据库相关的参数。[1]
全局变量
必须定义这些模块全局变量
- apilevel
- 字符串常量,表示支持的 DB API 级别。
目前只允许字符串“
1.0”和“2.0”。如果未给出,则应假定为 DB-API 1.0 级别接口。
- threadsafety
- 整数常量,表示接口支持的线程安全级别。可能的值为
threadsafety 含义 0 线程可能不共享模块。 1 线程可以共享模块,但不能共享连接。 2 线程可以共享模块和连接。 3 线程可以共享模块、连接和游标。 上述上下文中的共享意味着两个线程可以在不使用互斥信号量实现资源锁定来封装资源的情况下使用资源。请注意,您不能总是通过使用互斥锁管理访问来使外部资源线程安全:资源可能依赖于全局变量或其他超出您控制范围的外部源。
- paramstyle
- 字符串常量,表示接口期望的参数标记格式类型。可能的值为[2]
paramstyle 含义 qmark问号样式,例如 ...WHERE name=?numeric数字、位置样式,例如 ...WHERE name=:1named命名样式,例如 ...WHERE name=:nameformatANSI C printf 格式代码,例如 ...WHERE name=%spyformatPython 扩展格式代码,例如 ...WHERE name=%(name)s
异常
模块应通过这些异常或其子类提供所有错误信息
- Warning
- 因重要警告(例如插入时数据截断等)而引发的异常。它必须是 Python
Exception类的子类 [10] [11]。
- Error
- 所有其他错误异常的基类。您可以使用此异常通过单个
except语句捕获所有错误。警告不被视为错误,因此不应将此类用作基类。它必须是 PythonException类的子类 [10]。
- InterfaceError
- 因与数据库接口而非数据库本身相关的错误而引发的异常。它必须是 Error 的子类。
- DatabaseError
- 因与数据库相关的错误而引发的异常。它必须是 Error 的子类。
- DataError
- 因处理数据问题(例如除以零、数值超出范围等)而引发的异常。它必须是 DatabaseError 的子类。
- OperationalError
- 因数据库操作相关且不一定在程序员控制下的错误(例如,发生意外断开连接、找不到数据源名称、无法处理事务、处理期间发生内存分配错误等)而引发的异常。它必须是 DatabaseError 的子类。
- IntegrityError
- 当数据库的参照完整性受到影响时(例如,外键检查失败)引发的异常。它必须是 DatabaseError 的子类。
- InternalError
- 当数据库遇到内部错误(例如,游标不再有效、事务不同步等)时引发的异常。它必须是 DatabaseError 的子类。
- ProgrammingError
- 因编程错误(例如,表未找到或已存在、SQL 语句中的语法错误、指定参数数量错误等)而引发的异常。它必须是 DatabaseError 的子类。
- NotSupportedError
- 当使用了数据库不支持的方法或数据库 API 时(例如,在不支持事务或已关闭事务的连接上请求 .rollback())引发的异常。它必须是 DatabaseError 的子类。
Exception
|__Warning
|__Error
|__InterfaceError
|__DatabaseError
|__DataError
|__OperationalError
|__IntegrityError
|__InternalError
|__ProgrammingError
|__NotSupportedError
注意
这些异常的值未定义。但是,它们应该能让用户很好地了解出了什么问题。
连接对象
连接对象应响应以下方法。
连接方法
- .close()
- 立即关闭连接(而不是在调用
.__del__()时)。从此时起,连接将无法使用;如果尝试对连接执行任何操作,将引发 Error(或子类)异常。这同样适用于所有尝试使用此连接的游标对象。请注意,在未先提交更改的情况下关闭连接将导致隐式回滚。
- .commit()
- 将所有挂起的事务提交到数据库。
请注意,如果数据库支持自动提交功能,则此功能最初必须关闭。可以提供接口方法将其重新打开。
不支持事务的数据库模块应使用空功能实现此方法。
- .rollback()
- 此方法是可选的,因为并非所有数据库都提供事务支持。[3]
如果数据库确实提供事务,此方法会导致数据库回滚到任何挂起事务的开始。在未先提交更改的情况下关闭连接将导致隐式回滚。
- .cursor()
- 使用连接返回一个新的 Cursor 对象。
如果数据库不提供直接游标概念,模块将必须通过其他方式模拟游标,以满足本规范的需求。[4]
游标对象
这些对象表示数据库游标,用于管理获取操作的上下文。从同一连接创建的游标不是隔离的,即,由一个游标对数据库所做的任何更改对其他游标立即可见。从不同连接创建的游标可以或不可以隔离,具体取决于事务支持的实现方式(另请参阅连接的 .rollback() 和 .commit() 方法)。
游标对象应响应以下方法和属性。
游标属性
- .description
- 此只读属性是一个由 7 项序列组成的序列。
每个序列都包含描述一个结果列的信息
名称type_codedisplay_sizeinternal_size精度比例null_ok
前两项(
name和type_code)是强制性的,其他五项是可选的,如果无法提供有意义的值,则设置为None。对于不返回行的操作,或如果游标尚未通过 .execute*() 方法调用操作,则此属性将为
None。type_code可以通过与下面部分中指定的 Type Objects 进行比较来解释。
- .rowcount
- 此只读属性指定上次 .execute*() 产生的行数(对于像
SELECT这样的 DQL 语句)或受影响的行数(对于像UPDATE或INSERT这样的 DML 语句)。[9]如果游标上未执行 .execute*() 或接口无法确定上次操作的行数,则属性为 -1。[7]
注意
DB API 规范的未来版本可能会将后一种情况重新定义为对象返回
None而不是 -1。
游标方法
- .callproc( procname [, parameters ] )
- (此方法是可选的,因为并非所有数据库都提供存储过程。[3])
使用给定名称调用存储的数据库过程。参数序列必须包含过程期望的每个参数的一个条目。调用的结果作为输入序列的修改副本返回。输入参数保持不变,输出和输入/输出参数替换为可能的新值。
过程还可以提供结果集作为输出。然后必须通过标准 .fetch*() 方法使其可用。
- .close()
- 立即关闭游标(而不是在调用
__del__时)。从此时起,游标将无法使用;如果尝试对游标执行任何操作,将引发 Error(或子类)异常。
- .execute(operation [, parameters])
- 准备并执行数据库操作(查询或命令)。
参数可以作为序列或映射提供,并将绑定到操作中的变量。变量以数据库特定的符号指定(有关详细信息,请参阅模块的 paramstyle 属性)。[5]
游标将保留对操作的引用。如果再次传入相同的操作对象,则游标可以优化其行为。这对于使用相同操作但绑定不同参数(多次)的算法最有效。
为了在重用操作时实现最大效率,最好使用 .setinputsizes() 方法提前指定参数类型和大小。参数与预定义信息不匹配是合法的;实现应进行补偿,可能会导致效率损失。
参数也可以指定为元组列表,例如在单个操作中插入多行,但这种用法已弃用:应改用 .executemany()。
返回值未定义。
- .executemany( operation, seq_of_parameters )
- 准备数据库操作(查询或命令),然后针对序列 seq_of_parameters 中找到的所有参数序列或映射执行它。
模块可以自由地使用对 .execute() 方法的多次调用来实现此方法,或者使用数组操作在一次调用中将序列作为一个整体进行数据库处理。
将此方法用于生成一个或多个结果集的操作会产生未定义的行为,并且当实现检测到操作调用已创建结果集时,允许(但不要求)引发异常。
与 .execute() 相同的注释也相应地适用于此方法。
返回值未定义。
- .fetchone()
- 获取查询结果集的下一行,返回单个序列,或在没有更多数据可用时返回
None。[6]如果上次调用 .execute*() 未产生任何结果集或尚未发出调用,则会引发 Error(或子类)异常。
- .fetchmany([size=cursor.arraysize])
- 获取查询结果的下一组行,返回一个序列的序列(例如,元组列表)。当没有更多行可用时,返回一个空序列。
每次调用要获取的行数由参数指定。如果未给出,则游标的 arraysize 决定要获取的行数。方法应尝试获取 size 参数指示的行数。如果由于指定行数不可用而无法实现,则可能会返回较少的行。
如果上次调用 .execute*() 未产生任何结果集或尚未发出调用,则会引发 Error(或子类)异常。
请注意,size 参数涉及性能考虑。为了获得最佳性能,通常最好使用 .arraysize 属性。如果使用 size 参数,那么它最好在每次 .fetchmany() 调用中保持相同的值。
- .fetchall()
- 获取查询结果的所有(剩余)行,将它们作为序列的序列(例如,元组列表)返回。请注意,游标的 arraysize 属性可能会影响此操作的性能。
如果上次调用 .execute*() 未产生任何结果集或尚未发出调用,则会引发 Error(或子类)异常。
- .nextset()
- (此方法是可选的,因为并非所有数据库都支持多个结果集。[3])
此方法将使游标跳到下一个可用集,丢弃当前集中的任何剩余行。
如果没有更多集,方法返回
None。否则,它返回一个真值,并且后续调用 .fetch*() 方法将从下一个结果集中返回行。如果上次调用 .execute*() 未产生任何结果集或尚未发出调用,则会引发 Error(或子类)异常。
- .arraysize
- 此读/写属性指定 .fetchmany() 一次获取的行数。它默认为 1,表示一次获取一行。
实现必须遵守此值与 .fetchmany() 方法的关系,但可以自由地一次与数据库交互一行。它也可以用于 .executemany() 的实现。
- .setinputsizes(sizes)
- 这可以在调用 .execute*() 之前使用,以预定义操作参数的内存区域。
sizes 指定为一个序列 — 每个输入参数一个项。该项应是与将使用的输入对应的类型对象,或者它应是一个整数,指定字符串参数的最大长度。如果该项是
None,则不会为该列保留预定义的内存区域(这对于避免为大型输入预定义区域很有用)。此方法将在调用 .execute*() 方法之前使用。
实现可以自由地不执行任何操作,用户可以自由地不使用它。
- .setoutputsize(size [, column])
- 为获取大型列(例如
LONG、BLOB等)设置列缓冲区大小。列指定为结果序列的索引。不指定列将为游标中的所有大型列设置默认大小。此方法将在调用 .execute*() 方法之前使用。
实现可以自由地不执行任何操作,用户可以自由地不使用它。
类型对象和构造函数
许多数据库需要以特定格式输入,以便绑定到操作的输入参数。例如,如果输入用于 DATE 列,则必须以特定字符串格式将其绑定到数据库。对于“行 ID”列或大型二进制项(例如 blobs 或 RAW 列)也存在类似问题。这给 Python 带来了问题,因为 .execute*() 方法的参数是无类型的。当数据库模块看到 Python 字符串对象时,它不知道是应该将其绑定为简单的 CHAR 列、作为原始 BINARY 项,还是作为 DATE。
为了克服这个问题,模块必须提供下面定义的构造函数来创建可以保存特殊值的对象。当传递给游标方法时,模块可以检测输入参数的正确类型并相应地绑定它。
Cursor 对象的 description 属性返回有关查询的每个结果列的信息。type_code 必须与下面定义的 Type Objects 之一比较相等。类型对象可以等于多个类型代码(例如,DATETIME 可以等于日期、时间和时间戳列的类型代码;有关详细信息,请参阅下面的 实现提示)。
模块导出以下构造函数和单例
- Date(year, month, day)
- 此函数构造一个保存日期值的对象。
- Time(hour, minute, second)
- 此函数构造一个保存时间值的对象。
- Timestamp(year, month, day, hour, minute, second)
- 此函数构造一个保存时间戳值的对象。
- DateFromTicks(ticks)
- 此函数从给定的 ticks 值(自纪元以来的秒数;有关详细信息,请参阅标准 Python 时间模块的文档)构造一个保存日期值的对象。
- TimeFromTicks(ticks)
- 此函数从给定的 ticks 值(自纪元以来的秒数;有关详细信息,请参阅标准 Python 时间模块的文档)构造一个保存时间值的对象。
- TimestampFromTicks(ticks)
- 此函数从给定的 ticks 值(自纪元以来的秒数;有关详细信息,请参阅标准 Python 时间模块的文档)构造一个保存时间戳值的对象。
- Binary(string)
- 此函数构造一个能够保存二进制(长)字符串值的对象。
- STRING 类型
- 此类型对象用于描述数据库中基于字符串的列(例如
CHAR)。
- BINARY 类型
- 此类型对象用于描述数据库中的(长)二进制列(例如
LONG、RAW、BLOBs)。
- NUMBER 类型
- 此类型对象用于描述数据库中的数字列。
- DATETIME 类型
- 此类型对象用于描述数据库中的日期/时间列。
- ROWID 类型
- 此类型对象用于描述数据库中的“行 ID”列。
SQL NULL 值在输入和输出时由 Python None 单例表示。
注意
使用 Unix 滴答进行数据库接口可能会因其覆盖的日期范围有限而导致问题。
可选的 DB API 扩展
在 DB API 2.0 的生命周期中,模块作者经常将其实现扩展到超出此 DB API 规范的要求。为了增强兼容性并为规范可能的未来版本提供清晰的升级路径,本节定义了一组核心 DB API 2.0 规范的常见扩展。
与所有 DB API 可选功能一样,数据库模块作者可以自由选择不实现这些额外的属性和方法(使用它们将导致 AttributeError),或者在运行时只能检查可用性时引发 NotSupportedError。
有人建议通过 Python 警告框架发出 Python 警告,使这些扩展的使用对程序员可选可见。为了使此功能有用,警告消息必须标准化,以便能够屏蔽它们。这些标准消息在下文中称为 Warning Message。
- Cursor.rownumber
- 此只读属性应提供游标在结果集中的当前 0-based 索引,如果无法确定索引,则为
None。该索引可以看作是游标在序列(结果集)中的索引。下一个获取操作将获取该序列中由 .rownumber 索引的行。
警告消息: “使用了 DB-API 扩展 cursor.rownumber”
- Connection.Error, Connection.ProgrammingError, 等
- DB API 标准定义的所有异常类都应作为属性(除了在模块范围内可用之外)暴露在 Connection 对象上。
这些属性简化了多连接环境中的错误处理。
警告消息: “使用了 DB-API 扩展 connection.<exception>”
- Cursor.connection
- 此只读属性返回对创建游标的 Connection 对象的引用。
该属性简化了多连接环境中多态代码的编写。
警告消息: “使用了 DB-API 扩展 cursor.connection”
- Cursor.scroll(value [, mode=’relative’ ])
- 根据 mode 将游标在结果集中滚动到新位置。
如果 mode 为
relative(默认),value 将被视为结果集中当前位置的偏移量;如果设置为absolute,value 表示绝对目标位置。如果滚动操作将离开结果集,则应引发
IndexError。在这种情况下,游标位置保持未定义(理想情况下根本不移动游标)。注意
此方法应使用本机可滚动游标(如果可用),或对仅向前可滚动游标恢复到仿真。该方法可能会引发 NotSupportedError,以表示数据库不支持特定操作(例如,向后滚动)。
警告消息: “使用了 DB-API 扩展 cursor.scroll()”
- Cursor.messages
- 这是一个 Python 列表对象,接口将所有从底层数据库接收到的针对此游标的消息(异常类,异常值)追加到其中。
除 .fetch*() 调用外,所有标准游标方法调用(在执行调用之前)都会自动清除该列表,以避免过多的内存使用,也可以通过执行
del cursor.messages[:]来清除。数据库生成的所有错误和警告消息都放置在此列表中,因此检查列表允许用户验证方法调用的正确操作。
此属性的目的是消除对 Warning 异常的需求,Warning 异常经常导致问题(某些警告实际上只具有信息性)。
警告消息: “使用了 DB-API 扩展 cursor.messages”
- Connection.messages
- 与 Cursor.messages 相同,不同之处在于列表中的消息是面向连接的。
所有标准连接方法调用(在执行调用之前)都会自动清除该列表,以避免过多的内存使用,也可以通过执行
del connection.messages[:]来清除。警告消息: “使用了 DB-API 扩展 connection.messages”
- Cursor.next()
- 使用与 .fetchone() 相同的语义从当前执行的 SQL 语句返回下一行。对于 Python 2.2 及更高版本,当结果集耗尽时,会引发
StopIteration异常。以前的版本没有StopIteration异常,因此该方法应改为引发IndexError。警告消息: “使用了 DB-API 扩展 cursor.next()”
- Cursor.__iter__()
- 返回自身以使游标与迭代协议兼容 [8]。
警告消息: “使用了 DB-API 扩展 cursor.__iter__()”
- Cursor.lastrowid
- 此只读属性提供最后修改行的行 ID(大多数数据库仅在执行单个
INSERT操作时返回行 ID)。如果操作未设置行 ID 或数据库不支持行 ID,则此属性应设置为None。如果上次执行的语句修改了多行(例如,使用
.executemany()进行INSERT),则.lastrowid的语义未定义。警告消息: “使用了 DB-API 扩展 cursor.lastrowid”
- Connection.autocommit
- 用于查询和设置连接的自动提交模式的属性。
如果连接在自动提交(非事务性)模式下运行,则返回
True。如果连接在手动提交(事务性)模式下运行,则返回False。将属性设置为
True或False会相应地调整连接的模式。将设置从
True更改为False(禁用自动提交)将使数据库退出自动提交模式并开始新的事务。将设置从False更改为True(启用自动提交)具有与处理挂起事务相关的数据库相关语义。[12]弃用通知:尽管有几个数据库模块实现了此属性的读写特性,但通过写入属性设置自动提交模式已被弃用,因为这可能导致 I/O 和相关异常,使其难以在异步上下文中实现。[13]
警告消息: “使用了 DB-API 扩展 connection.autocommit”
可选的错误处理扩展
核心 DB API 规范只引入了一组可以引发的异常,用于向用户报告错误。在某些情况下,异常可能对程序的流程干扰太大,甚至导致执行不可能。
对于这些情况,为了简化处理数据库时的错误处理,数据库模块作者可以选择实现用户可定义的错误处理程序。本节描述了定义这些错误处理程序的标准方法。
- Connection.errorhandler, Cursor.errorhandler
- 读/写属性,引用在满足错误条件时调用的错误处理程序。
处理程序必须是 Python 可调用对象,接受以下参数
errorhandler(connection, cursor, errorclass, errorvalue)
其中 connection 是对游标操作所在的连接的引用,cursor 是对游标的引用(如果错误不适用于游标,则为
None),errorclass 是一个错误类,用于使用 errorvalue 作为构造参数进行实例化。标准错误处理程序应将错误信息添加到相应的
.messages属性(Connection.messages 或 Cursor.messages)中,并引发由给定 errorclass 和 errorvalue 参数定义的异常。如果未设置
.errorhandler(该属性为None),则应应用上述标准错误处理方案。警告消息: “使用了 DB-API 扩展 .errorhandler”
游标应在游标创建时从其连接对象继承 .errorhandler 设置。
可选的两阶段提交扩展
许多数据库支持两阶段提交 (TPC),这允许管理跨多个数据库连接和其他资源的事务。
如果数据库后端提供两阶段提交支持,并且数据库模块作者希望公开此支持,则应实现以下 API。如果只能在运行时检查数据库后端对两阶段提交的支持,则应引发 NotSupportedError。
TPC 事务 ID
由于许多数据库遵循 XA 规范,事务 ID 由三个组件组成
- 格式 ID
- 全局事务 ID
- 分支限定符
对于特定的全局事务,前两个组件对于所有资源都应该相同。全局事务中的每个资源都应该分配一个不同的分支限定符。
各个组件必须满足以下条件
- 格式 ID:一个非负的 32 位整数。
- 全局事务 ID 和分支限定符:不超过 64 个字符的字节字符串。
事务 ID 使用 .xid() 连接方法创建
- .xid(format_id, global_transaction_id, branch_qualifier)
- 返回一个事务 ID 对象,适用于传递给此连接的 .tpc_*() 方法。
如果数据库连接不支持 TPC,则引发 NotSupportedError。
.xid() 返回的对象的类型未定义,但它必须提供序列行为,允许访问这三个组件。符合条件的数据库模块可以选择使用元组而不是自定义对象来表示事务 ID。
TPC 连接方法
- .tpc_begin(xid)
- 使用给定的事务 ID xid 开始 TPC 事务。
此方法应在事务之外调用(即,自上次 .commit() 或 .rollback() 以来可能没有执行任何操作)。
此外,在 TPC 事务中调用 .commit() 或 .rollback() 是错误的。如果应用程序在活动的 TPC 事务期间调用 .commit() 或 .rollback(),则会引发 ProgrammingError。
如果数据库连接不支持 TPC,则引发 NotSupportedError。
- .tpc_prepare()
- 执行以 .tpc_begin() 开始的事务的第一阶段。如果在 TPC 事务之外调用此方法,应引发 ProgrammingError。
调用 .tpc_prepare() 后,在调用 .tpc_commit() 或 .tpc_rollback() 之前,不能执行任何语句。
- .tpc_commit([ xid ])
- 在不带参数调用时,.tpc_commit() 提交先前用 .tpc_prepare() 准备的 TPC 事务。
如果在 .tpc_prepare() 之前调用 .tpc_commit(),则执行单阶段提交。如果只有一个资源参与全局事务,事务管理器可以选择这样做。
当使用事务 ID xid 调用时,数据库提交给定的事务。如果提供无效的事务 ID,将引发 ProgrammingError。此形式应在事务之外调用,并旨在用于恢复。
返回时,TPC 事务结束。
- .tpc_rollback([ xid ])
- 在不带参数调用时,.tpc_rollback() 回滚 TPC 事务。它可以在 .tpc_prepare() 之前或之后调用。
当使用事务 ID xid 调用时,它回滚给定的事务。如果提供无效的事务 ID,则引发 ProgrammingError。此形式应在事务之外调用,并旨在用于恢复。
返回时,TPC 事务结束。
- .tpc_recover()
- 返回一个挂起事务 ID 列表,适用于
.tpc_commit(xid)或.tpc_rollback(xid)。如果数据库不支持事务恢复,它可能返回一个空列表或引发 NotSupportedError。
常见问题
数据库 SIG 经常看到关于 DB API 规范的重复问题。本节涵盖了人们有时对规范提出的一些问题。
问题
如何将 .fetch*() 返回的元组构建成字典?
答案
有几种现有工具可为此任务提供帮助。它们中的大多数都使用游标属性 .description 中定义的列名作为行字典中键的基础。
请注意,不将 DB API 规范扩展到也支持 .fetch*() 方法的字典返回值的原因是,这种方法有几个缺点
- 某些数据库不支持区分大小写的列名,或者会自动将它们转换为所有小写或所有大写字符。
- 结果集中由查询生成(例如,使用 SQL 函数)的列不映射到表列名,并且数据库通常以非常数据库特定的方式为这些列生成名称。
因此,通过字典键访问列在不同数据库之间有所不同,使得编写可移植代码成为不可能。
从 1.0 版本到 2.0 版本的主要变化
Python 数据库 API 2.0 与 1.0 版本相比引入了一些重大更改。由于其中一些更改将导致现有基于 DB API 1.0 的脚本中断,因此主要版本号已调整以反映此更改。
以下是 1.0 到 2.0 最重要的变化
- 不再需要单独的 dbi 模块,功能已合并到模块接口本身。
- 为日期/时间值添加了新的构造函数和 类型对象,
RAW类型对象已重命名为BINARY。由此产生的一组类型应涵盖现代 SQL 数据库中常见的所有基本数据类型。 - 添加了新的常量(apilevel、threadsafety、paramstyle)和方法(.executemany()、.nextset())以提供更好的数据库绑定。
- 现在明确定义了调用存储过程所需的 .callproc() 的语义。
- .execute() 返回值的定义已更改。以前,返回值基于 SQL 语句类型(这很难正确实现)——现在未定义;改用更灵活的 .rowcount 属性。模块可以自由返回旧样式返回值,但这些不再是规范强制要求的,应被视为依赖于数据库接口。
- 基于类的 异常 已纳入规范。模块实现者可以自由地通过子类化定义的异常类来扩展本规范中定义的异常布局。
DB API 2.0 规范的发布后新增内容
- 指定了一组核心功能之外的额外可选 DB API 扩展。
未解决的问题
尽管 2.0 版规范澄清了 1.0 版中遗留的许多问题,但仍有一些问题应在未来版本中解决
- 在有新结果集可用时,为 .nextset() 定义一个有用的返回值。
- 集成 decimal 模块 的
Decimal对象,用作无损货币和十进制交换格式。
脚注
致谢
非常感谢 Andrew Kuchling,他在 2001 年将 Python 数据库 API 规范 2.0 从原始 HTML 格式转换为 PEP 格式。
非常感谢 James Henstridge,他领导了导致 2008 年两阶段提交 API 扩展标准化的讨论。
非常感谢 Daniele Varrazzo,他于 2012 年将规范从文本 PEP 格式转换为 ReST PEP 格式,从而允许链接到各个部分。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0249.rst