cx_Oracle和数据源范例

问题描述:

在Java DataSource中实现了数据库访问的Java范例。这个对象创建一个有用的抽象概念来创建数据库连接。 DataSource对象保留数据库配置,但仅根据请求创建数据库连接。这使您可以将所有数据库配置和初始化代码保留在一个位置,并且可以轻松更改数据库实现,或使用模拟数据库进行测试。cx_Oracle和数据源范例

我目前正在使用cx_Oracle的Python项目。在cx_Oracle,一是直接从模块获取连接:

import cx_Oracle as dbapi 
connection = dbapi.connect(connection_string) 
# At this point I am assuming that a real connection has been made to the database. 
# Is this true? 

我试图找到一个平行于cx_Oracle的DataSource。我可以通过创建一个新类并包装cx_Oracle来轻松创建它,但我想知道这是否是Python中正确的方法。

通过查看PEP-249: Python Database API Specification v2.0,可以找到有关如何通过Python访问数据库的相关信息。 cx_Oracle与许多用于Python的数据库驱动程序一样符合此规范。

在本规范中Connection对象表示数据库连接,但没有内置池。诸如SQLAlchemy之类的工具确实提供池化设施,尽管SQLAlchemy通常被称为ORM,但它不必像这样使用,并且提供了很好的抽象以供在SQL引擎之上使用。

如果您确实想做对象关系映射,那么SQLAlchemy会完成业务,您可以考虑使用自己的声明性语法或另一个层,例如位于SQLAlchemy之上的Elixir,并提供更高的易用性更常见的用例。

我不认为在Python中有这样做的“正确”方式,除了更进一步并在自己和数据库之间使用另一层。

根据想要使用DataSource概念的原因(我只在Java中遇到过),SQLAlchemy(或类似的东西)可能会为您解决问题,而无需您从头开始编写一些东西。

如果这不符合法案,编写自己的包装听起来像是一个合理的解决方案。

是的,Python有一个类似的抽象。

这是来自我们的本地构建回归测试,我们确保每当我们构建新的python时,我们都可以与我们所有的数据库进行交流。

if database == SYBASE: 
    import Sybase 
    conn = Sybase.connect('sybasetestdb','mh','secret') 
elif database == POSTRESQL: 
    import pgdb 
    conn = pgdb.connect('pgtestdb:mh:secret') 
elif database == ORACLE: 
    import cx_Oracle 
    conn = cx_Oracle.connect("mh/[email protected]") 

curs=conn.cursor() 
curs.execute('select a,b from testtable') 
for row in curs.fetchall(): 
    print row 

(注意,这是一个简单的版本,在我们的multidb数据的相关代码,我们有一个内部有这种逻辑DBConnection的类。)

我只是吸了起来,写我自己。它允许我添加抽象数据库(Oracle/MySQL/Access/etc),添加日志记录,事务回滚的错误处理等。