cx_Oracle和数据源模式
题
有是一个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?
我试图找到一个平行于cx_Oracle的DataSource
。我可以很容易地通过创建一个新的类和包装cx_Oracle创造这一点,但我想知道,这是做它在Python的正确途径。
解决方案
您会发现如何通过看访问Python的数据库的相关信息PEP-249:Python数据库API规范v2.0 。 cx_Oracle
符合本说明书中,作为用于Python做许多数据库驱动程序。
在本说明书中Connection
对象表示数据库连接,但没有内置的池。工具如 SQLAlchemy的确实提供合用设施,虽然SQLAlchemy的是定睛一ORM,它不具有被用作这样的,并提供好的抽象对SQL发动机的顶部使用。
如果你想这样做的对象 - 关系映射,然后SQLAlchemy的做业务,你可以考虑要么自己的声明语法或另一层如的药剂它位于上SQLAlchemy的顶部和提供增加的易用性更常见的用例。
其他提示
我不认为有一个“正确”的方式做到这一点在Python,也许除了走一步,用自己和数据库之间的另一层。
根据不同的原因想要使用的DataSource概念(我已经永远只能进来的Java跨),SQLAlchemy的(或类似的东西),可能会解决你的问题,而您不必从头开始。写东西
如果不符合要求,编写自己的包装听起来像一个合理的解决方案。
是,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数据的相关代码,我们有一个内部有这种逻辑DBConnection的类。)
我只吸了起来,写我自己。它让我补充之类的东西抽象数据库(ORACLE / MySQL的/交通/等),添加日志,与事务回滚等处理错误。