cx_Oracle和数据源范例

时间:2009-07-18 20:19:19

标签: python database oracle cx-oracle

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

我目前正在开发一个使用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中执行此操作的正确方法。

4 个答案:

答案 0 :(得分:3)

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

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

如果你确实想进行对象关系映射,那么SQLAlchemy可以完成这项业务,您可以考虑自己的声明性语法或另一个层,例如位于SQLAlchemy之上的Elixir,并提供更多的便利性用于更常见的用例。

答案 1 :(得分:1)

我不认为在Python中有一种“正确”的方法可以做到这一点,除了可以更进一步,在你自己和数据库之间使用另一层。

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

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

答案 2 :(得分:0)

是的,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/secret@oracletestdb")

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

(注意,这是简单版本,在我们的multidb-aware代码中,我们有一个dbconnection类,里面有这个逻辑。)

答案 3 :(得分:0)

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