部分:查询最佳应践
作者:
Przemyslaw Piotrowski
首先,熟悉
OraclePython
连接性的基本概念
2007
年
9
月发布
参见系列目录
在
Python
做事方式的核心原则中,有一个规定是要求具有到
API
的高级接口。数据库
API
(在此例中为
Oracle API
)就是一个例子。
使用
Computronix
的
cx_Oracle Python
模块,您可以在维持与
Python
数据库
API
规范
v2.0
的兼容性的同时,控制
Oracle
的查询模
型。
对于所有遵循该规范的客户端库而言,使用
DB API 2.0
查询数据库的模型都是一致的。在此基础上,
cx_Oracle
的主要开发人员
Anthony T
uininga
添加了一组丰富的属性和方法,以向开发人员揭示
Oracle
独有的特性。仅用标准的方法而忘掉
“
额外的
”
方法是绝对
可能的,但在本文中您不会这么做。通用数据库包装这一概念可能在某些情况下起作用,但与此同时,您会失去
RDBMS
提供的所有
优化。
DB API 2.0
和
cx_Oracle
介绍
Python
数据库
API
规范
v2.0
是集体努力的成果,用于统一不同数据库系统的访问模型。拥有一组相对较少的方法和属性,在更换数
据库供应商时就易于学习并保持一致。它不以任何方式将数据库对象映射到
Python
结构中。用户仍然需要手工编写
SQL
。在更换到
另一数据库后,此
SQL
可能需要重新编写。尽管如此,它还是出色妥善地解决了
Python
数据库的连接性问题。
该规范定义了
API
的各个部分,如模块接口、连接对象、游标对象、类型对象和构造器、
DB API
的可选扩展以及可选的错误处理机
制。
数据库和
Python
语言之间的网关是连接对象。它包含制作数据库驱动的应用程序所需的全部组件,不仅符合
DB API 2.0
,而且是规
范方法和属性的一个超集。在多线程的程序中,模块和连接可以在不同线程间共享,但是不支持游标共享。这一限制通常是可接受
的,因为共享游标可能带来死锁风险。
Python
大量使用了异常模型,
DB API
定义了若干标准异常,它们在调试应用程序中的问题时会非常有用。下面是一些标准异常,同
时提供了原因类型的简要说明:
Warning
—
数据在执行插入操作时被截断,等等
Error
—
这里提到的除
Warning
外的所有异常的基类。
InterfaceError
—
数据库接口而非数据库本身故障(本例为
cx_Oracle
问题)
DatabaseError
—
严格意义上的数据库问题
DataError
—
包含如下结果数据的问题除数为
0
,值超出范围等
OperationalError
—
与编程人员无关的数据库错误:连接丢失、内存分配错误、事务处理错误等
IntegrityError
—
数据库的关系完整性受到了影响,例如,外键约束失败
InternalError
—
数据库遇到内部错误,例如,游标无效、事务不同步
ProgrammingError
—
未找到表、
SQL
语句中的语法错误、指定参数的数量错误等
NotSupportedError
—
调用的
API
部件并不存在
连接过程首先从连接对象开始,这是创建游标对象的基础。除游标操作外,连接对象还使用
commit()
和
rollback()
方法对事务进行管
理。执行
SQL
查询、发出
DML/DCL
语句和获取结果这些过程均受游标控制。
在游标和连接类的实现中,
cx_Oracle
对标准的
DB API 2.0
规范进行了最大程度的扩展。如果需要,所有这些扩展都将在文本中清楚
地标记。
入门
在使用查询和游标之前,首先需要建立数据库连接。提供凭证和数据源名称的方法有多种,其结果都是相似的。在从下面的
Python
交互式会话提取的内容中,连接对象
db
、
db1
和
db2
都是等同的。
makedsn()
函数根据给定的参数值创建一个
TNS
条目。此处将它
赋值给变量
dsn_tns
。如果环境设置得当,您可以使用更短的形式
cx_Oracle.connect('hr/hrpwd')
,从而省略用于
db
和
db1
的简单
连接字符串。