当你使用SQL炼金术时,我们需要加入控制器或模型吗?

2024-05-13 19:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在MVC框架中,通常在哪里嵌入SQL炼金术代码,将查询放在Controller Methods中还是只使用Model Methods是理想的选择?在

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

或者我把它委托给一个接受参数的模型方法?最好的方法是什么?后者的好处之一是可以重用,几乎为API程序员提供了一个视图。另一个优点是,如果我把它作为一个类方法,我可以轻松地克服它。这通常有助于定制,尤其是在商业软件中。在

^{pr2}$

TL;DR:当您使用ORM的SQL炼金术时,MVC中“M”的概念不是很模糊吗?我对ModelViewController设计模式没有任何问题。在

[注:我不确定这是否属于代码审查网站,如果是,请让我知道,我可以转移过来。]


Tags: 方法代码框架sqlmodelsessionquerydocument
2条回答

我倾向于将数据库查询代码放在控制器中,而不是模型中。据我所知,模型方法是用来将模型的数据转换成其他数据。在

例如,UserModel可以有一个FullName()方法来返回用户的名字和姓氏的连接。在

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

我非常喜欢第二种方法。它有几个优点:

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

相关问题 更多 >