为SQL Alchemy后端编写DAO

时间:2019-01-03 15:53:05

标签: python oop sqlalchemy

我正在研究使用Falcon作为框架的SQL Alchemy支持的REST服务,并尝试尽可能干净地将服务层与数据库层分开,并希望在将来的某个时候将其扩展到成千上万个用户和请求。

我的背景主要是Java,所以我已经使用DAO模式完成了很多次工作-DAO模式是一个数据访问对象,它包装对数据库的调用(即,创建,查询,更新,删除)并隐藏实现细节,例如SQL语句,事务,会话,提交等。我正在尝试找出是否有人在Python中执行此操作,并且您会使用与Java中相同的面向对象,依赖项注入方法,还是会使用其他方法。

选项A:

我的经验是在应用程序启动时创建DAO,并将其“注入”到需要它们的REST服务层中。因此,在猎鹰的“资源”中:

class FooResource():

    def on_post(self, req, resp):
        foo_form = json.loads(req.stream.read().decode("utf-8"))
        dao: FooDAO = self.daos[FooDAO.__name__]
        dao.create_foo(foo_form)

在这里, self.daos 会在应用程序启动时填充,类似于您引导弹簧容器的方式。 DAO将使用SQL Alchemy会话注册表对象实例化,并且该会话将在DAO方法中动态创建。 FooDAO看起来像这样:

class FooDAO():

    def __init__(self, session_registry: scoped_session):
        self.session_registry = session_registry

    def create_foo(self, foo_form):
        session = self.session_registry()
        foo = FooModel(foo_form)
        session.add(foo)

选项B:

依赖注入方法对于不熟悉这些概念的Python团队来说是很难的。另一个选择是对DAO层使用静态调用:

    def on_post(self, req, resp):
        foo_form = json.loads(req.stream.read().decode("utf-8"))
        session = req.context["session"]  # this is created in a Falcon middleware
        FooDAO.create_foo(foo_form, session)

在这种情况下,FooDAO不会保持任何状态:

class FooDAO():

    @staticmethod
    def create_foo(self, foo_form, session):
        foo = FooModel(foo_form)
        session.add(foo)

我对静态的经验是强烈反对使用它们,并在类之间建立了紧密的联系。但是,我没有在Python社区看到这个问题-也许是因为类没有得到广泛使用?

选项C:

第三个选择是简化并在没有类的情况下执行此操作。我并不反对这种想法,但是采用这种方法,我们将失去对象继承和封装的某些好处。

0 个答案:

没有答案