PEP 249 - Python 数据库 API 规范 v2.0

予早 2025-08-31 14:59:18
Categories: Tags:

PEP 249 - Python 数据库 API 规范 v2.0

原文链接:https://peps.python.org/pep-0249

作者:Marc-André Lemburg <mal at lemburg.com>

讨论:Db-SIG list

状态:Final

类型:Informational

创建时间:12-Apr-1999

文章历史:

替代:PEP 248

介绍

这个API定义用于促进访问数据库的Python模块间的相似性。通过这样,我们希望实现一种一致性,其使得模块更易理解,代码在不同数据库间更具可移植性,以及Python对更广泛的数据库的连接支持。

关于该规范的评论和问题由SIG for Database Interfacing with Python直接领导。

更多关于数据库接口和可用包的信息见Database Topic Guide

该文档描述了Python数据库API 2.0以及一系列通用可选扩展。先前的PEP 248中的1.0版本规范依然可作为参考。鼓励包开发者采用本规范版本作为新接口的基础规范。

模块接口

constructors,构造函数

数据库的访问是通过连接对象来实现的。模块必须为这些连接对象提供以下构造函数:

connect(parameters…)

globals,模块全局属性

模块全局变量必须定义:

apilevel

threadsafety

整数常量,指明当前接口支持的线程安全级别。可能的值有:

线程安全性 描述
0 线程不共享模块
1 线程可以共享模块,但连接不共享
2 线程和连接都可以共享模块
3 线程、连接和游标都可以共享模块

在上面所属上下文(线程、连接和游标)中共享资源意味着两个线程可以使用一个资源,而无需使用互斥信号量来实现资源锁定。注意,无法总是通过使用互斥手段管理资源访问从而使得外部资源线程安全:资源可能依赖于全局变量或其他控制范围的外部资源。

paramstyle

字符串常量,指明接口期望的参数标记格式化类型。可能的值有:

参数标记格式化类型 描述
qmark 问题标记风格,例如... WHERE name=?
numberic 数字位置风格,例如... WHERE name=:1
named 名称风格,例如... WHERE name=:name
format ANSI C printf格式化代码风格,例如... Where name=%s
pyformat Python扩展格式化代码风格,例如... where name=%(name)s

exceptions,异常

模块应当通过下方异常或其子类提供错误信息。

Warning

重要的警告,例如,插入数据时的数据截断。其必须是PythonException的子类。[10][11]

Error

所有其他错误异常的基类,可以使用该类及单个except语句捕获所有错误,Warning不被认为是错误,因此不会使用该类作为基类,Error必须是PythonException的子类。[10]

InterfaceError

与数据库接口有关的错误,不是数据库本身的,必须是Error的子类。

DatabaseError

与数据库本身有关的错误,必须是Error的子类。

DataError

由于数据处理问题造成的错误,例如,除零,值超出范围等等,必须是DatabaseError的子类。

OperationError

与数据库操作有关的问题造成的错误,不一定需要在开发者控制范围内,例如,意外断开连接、数据源名称未找到、事务无法处理,以及处理过程中发生内存分配错误等等,必须是DatabaseError的子类。

IntegrityError

数据库完整性约束导致的错误,例如,外键检查失败,必须是DatabaseError的子类。

InternalError

数据库内部错误导致的错误,例如,游标不再有效,事务同步问题等等,必须是DatabaseError的子类。

ProgrammingError

编程问题导致的错误,例如,表找不到或已经存在,SQL语句格式错误,参数数量不对等等,必须是DatabaseError的子类。

NotSupportedError

当使用的方法或数据库API不被数据库支持时的错误,例如,在一个不支持事务或者事务已经关闭的连接上调用rollback(),必须是DatabaseError的子类。

异常继承关系[10][11]

Exception
|__Warning
|__Error
   |__InterfaceError
   |__DatabaseError
      |__DataError
      |__OperationalError
      |__IntegrityError
      |__InternalError
      |__ProgrammingError
      |__NotSupportedError

[!NOTE]

没有定义这些异常的具体值,但应当能够给用户一个相当好的关于出了什么问题的概念。

Connection对象

Connection对象应当支持如下方法:

Connection方法

close()

commit()

rollback()

cusor()

Cursor对象

这些对象表示一个数据库游标,游标用于管理获取操作的上下文。从同一连接创建的游标不是隔离的,也就是说,游标对数据库所做的任何更改都会立即被其他游标“看到”。根据事务支持的实现方式,从不同连接创建的游标可以隔离也可以不隔离(另请参阅连接的rollback()和commit()方法)。

Cursor应当支持如下属性和方法:

Cursor属性

description

rowcount

[!NOTE]

数据库API规范的未来版本中会重新定义后一种情况(指最后一个操作该接口无法判断查询或影响行数)返回None而不是-1。

Cursor方法

callproc(procname [, parameters])

close()

execute(operation [, parameters])

executemany(operation, seq_of_parameters)

fetchone()

fetchmany([size=cursor.arraysize])

fetchall()

nextset()

arraysize

setinputsizes(sises)

setoutputsize(size [, column])

Type Objects and Constructors

许多数据库需要有特定格式的输入,以便绑定到操作的输入参数。例如,若一个输入的目标是DATE列,那么该输入必须以特定字符串格式绑定到数据库。“Row ID”列合伙大型二进制列(例如,blob或RAW列)也存在类似问题。这给Python带来了问题,因为execute*()方法的参数是不含(数据库)类型的。当数据库模块遇到一个Python字符串对象,不知道其应当绑定为CHAR列、原始BINARY列,还是DATE列。

为克服该问题,模块必须提供定义在下面的构造函数,用以创建能够存储特殊值的对象。当该对象传给游标方法时,模块可以检测到输入参数的正确类型然后进行绑定。

游标对象的description属性返回查询结果集每一列的信息。type_code必须与下面定义的对象进行相等比较。Type Object可能不仅仅等于一个类型代码(例如,DATETIME可能等于date、time和timestamp列的类型代码,详见下面对模块开发者的实现提示小节)。

该模块导出如下构造函数和单例:

Date(year, month, day)

Time(hour, minute, second)

Timestamp(year, month, day, hour, minute, second)

DateFromTicks(ticks)

TimeFromTicks(ticks)

TimestampFromTicks(ticks)

Binary(string)

STRING type

BINARY type

NUMBER type

DATETIME type

ROWID type

SQL NULL值由输入和输出上的Python None单例表示。

[!NOTE]

使用Unix时钟用于数据库接口可能会造成问题,因为其覆盖的日期范围有限。

对模块开发者的实现提示