cx_Oracle与数据源范式
在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中是否合适。
4 个回答
我决定自己动手写一个。这让我可以添加一些功能,比如把数据库抽象化(支持Oracle、MySQL、Access等),增加日志记录,处理错误时可以回滚事务等等。
我觉得在Python中没有一种“正确”的做法,可能唯一的例外就是在你和数据库之间再加一层东西。
如果你想使用数据源这个概念(我只在Java中见过),那么SQLAlchemy(或者类似的工具)可能会帮你解决问题,这样你就不需要从头开始写代码了。
如果这些都不合适,自己写一个包装器听起来也是个不错的选择。
如果你想了解如何在Python中访问数据库,可以看看这个链接:PEP-249: Python数据库API规范v2.0。cx_Oracle
这个库符合这个规范,很多Python的数据库驱动也是这样。
在这个规范中,Connection
对象代表一个数据库连接,但它没有内置的连接池功能。像SQLAlchemy这样的工具提供了连接池的功能。虽然SQLAlchemy常常被称为ORM(对象关系映射),但你并不一定要把它用作ORM,它也提供了很好的抽象,方便在SQL引擎上使用。
如果你确实想做对象关系映射,SQLAlchemy是个不错的选择。你可以考虑使用它自己的声明式语法,或者使用像Elixir这样的工具,它是在SQLAlchemy之上的一层,能让你在处理常见用例时更加简单。