在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中执行此操作的正确方法。
答案 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),添加日志记录,事务回滚的错误处理等等。