在Python类中处理数据库对象的好方法是什么?
我应该在每个类的方法里直接访问全局的数据库对象吗?还是说在每个方法里都创建一个数据库对象的实例呢?
我的一个数据库对象会根据访问的信息的ID而变化,所以是通过一个叫做connectToDatabase(id)的函数来创建的。我应该把这个函数做成全局的,让它返回一个数据库对象,然后在每个方法里实例化它,还是有其他更好的办法呢?
谢谢。
2 个回答
2
在这种情况下,就像很多其他情况一样,我更喜欢使用依赖注入:让你的类(比如在它的__init__
方法里)接受数据库连接作为一个参数。
这样做可以让测试变得更简单、更清晰,还可以根据需要切换策略(比如,如果你发现一次性连接数据库的数量太多,可以改用“数据库连接池”的策略),同时也能更准确和灵活地分配责任。
总的来说,我认为依赖注入可能是最重要的设计模式之一,而这个模式在著名的“Gang of 4”书里并没有被列出!-)
1
SQLAlchemy建议创建会话的函数应该是全局的。
http://www.sqlalchemy.org/docs/reference/orm/sessions.html#sqlalchemy.orm.sessionmaker
这个sessionmaker()函数应该在应用程序的全局范围内调用,返回的类应该对应用程序的其他部分可用,作为创建会话的唯一类。