3

在 Java 中实现了用于数据库访问的 Java 范例DataSource。这个对象围绕数据库连接的创建创建了一个有用的抽象。该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?

我试图找到与DataSourcecx_Oracle 中的平行。我可以通过创建一个新类并包装 cx_Oracle 轻松地创建它,但我想知道这是否是在 Python 中执行此操作的正确方法。

4

4 回答 4

3

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

在本规范中,一个Connection对象代表一个数据库连接,但没有内置池。诸如SQLAlchemy之类的工具确实提供了池化功能,尽管 SQLAlchemy 通常被称为 ORM,但它不一定非要这样使用,它提供了很好的抽象,可在 SQL 引擎之上使用。

如果您确实想要进行对象关系映射,那么 SQLAlchemy 可以完成这项工作,您可以考虑使用它自己的声明性语法或其他层,例如位于 SQLAlchemy 之上并为更常见的用例提供更高易用性的Elixir .

于 2009-07-18T21:30:47.017 回答
1

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

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

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

于 2009-07-18T20:50:45.600 回答
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 类,里面有这个逻辑。)

于 2009-07-19T00:50:08.700 回答
0

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

于 2009-07-21T02:28:17.563 回答