2016-03-18 13 views
0

在MVC框架,你通常在哪裏嵌入SQL鍊金術代碼,它是理想的把查詢的Controller Methods或只使用Model Methods當您使用SQL Alchemy時,我們是否需要加入控制器或模型?

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

或者我只是委託此模型方法需要一個參數?什麼是這樣做的首選方式?後者的好處之一是它可以重複使用,它幾乎爲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:是不是在MVC 「M」 的概念模糊,當你使用ORM的像SQL鍊金術?我沒有任何問題ModelViewController設計模式。

[PS:我不知道這是否屬於代碼審查網站,如果是的話請讓我知道,我可以調過來]

回答

2

我強烈傾向於第二種做法。它有幾個優點:

  • 您的控制器代碼可能是愚蠢的。這很好。只從後端獲取數據的控制器,可能會重新格式化一些數據,並將其傳遞給視圖,這很容易推理。
  • 它更容易隔離測試該方法。您可以運行getdocument('valid_name')getdocument(None)getdocument(123)等,以確保他們的所有工作或無法按照預期不處理所有周邊控制器代碼。
  • 它更容易測試控制器。您可以編寫getdocument()的模擬,以便它始終返回一個已知值並測試您的控制器是否正確處理它。
+0

我也沒多想測試,始終與去耦合的優點。 – Nishant

1

我傾向於把數據庫查詢代碼的控制器,而不是模型。根據我的理解,模型方法用於將模型的數據轉換爲其他東西。

例如,UserModel可能有一個FullName()方法來返回用戶名和姓的拼接。

然而,UserController包含一個GetAll()方法來獲取所有用戶的列表,這是查找數據庫查詢代碼的位置。

+0

它適用於小型查詢,但如果您一遍又一遍地重複您的查詢,這在Web應用程序中非常常見,這會變得非常棘手。想象一下你想定製一些東西。 – Nishant

+0

@Nishant True。儘管您總是可以將最常見的查詢抽象爲父控制器,並根據需要繼承它。 – Brett

+0

我想那是什麼模型,至少在我的例子中:-)它只不過是Python的方法,只有SQL沒有其他的東西。這是你說的嗎?如果是這樣,我所說的「模型」是一樣的,除了我也在考慮參數化,所以它也可以重用。 Ao抽象,參數化並讓其他許多人也使用它。 – Nishant

相關問題