使用SQL Alchemy时是否需要加入控制器或模型?

时间:2016-03-18 15:41:50

标签: python sqlalchemy

在MVC框架中,您通常在哪里嵌入SQL Alchemy Code,是否可以将查询放入Controller Methods或仅使用Model Methods

query = session.query(User, Document, DocumentsPermissions).join(Document).join(DocumentsPermissions).filter_by(Document.name=="Something")

或者我只是将它委托给一个采用args的模型方法?这样做的首选方法是什么?后者的一个好处是它可以重复使用,它几乎为API程序员提供了一个视图。另一个优点是,如果我将它作为一种类方法,我可以轻松地覆盖它。这通常有助于自定义,特别是在商业软件中。

#Ctrl.py
self.getdocument("Foo")

#Mdl.py
def getdocument(name):
    query = session.query(User, Document, DocumentsPermissions).join(Document).join(DocumentsPermissions).filter_by(Document.name=="Something")

TL; DR :不是" M"的概念。在使用ORM的SQL Alchemy时,MVC模糊了吗?我对Model View Controller设计模式没有任何问题。

[PS:我不确定这是否属于Code Review网站,如果有,请告诉我,我可以转移。]

2 个答案:

答案 0 :(得分:2)

我更喜欢第二种方法。它有一些优点:

  • 您的控制器代码可能很愚蠢。这很好。只需从后端获取数据,可能重新格式化并将其传递给视图的控制器很容易理解。
  • 单独测试该方法更容易。您可以运行getdocument('valid_name')getdocument(None)getdocument(123)等,以确保它们按预期工作或失败,而无需处理所有周围的控制器代码。
  • 测试控制器更容易。您可以为getdocument()编写一个模拟器,以便它始终返回一个已知值并测试您的控制器是否正确处理它。

答案 1 :(得分:1)

我倾向于将数据库查询代码放在Controller而不是Model中。根据我的理解,模型方法用于将模型的数据转换为其他内容。

例如,UserModel可能有FullName()方法来返回用户的名字和姓氏的串联。

然而,UserController包含GetAll()方法来获取所有用户的列表,这是找到数据库查询代码的位置。