2013-08-21 46 views
0

而且,如果可以的話,這是否意味着我失去了將結果視爲對象的優勢?我發現複雜的查詢在許多ORM中令人困惑,而不僅僅是Django的。但是,這可能是因爲我從來沒有真正使用過ORM。有人使用SQL了嗎?我可以在Django模型中使用直SQL嗎?

編輯:如果我完全繞過ORM,我是否擊敗了擁有框架的目的?他們都有一個「漂亮」的ORM,但是當涉及到有很多子查詢,派生表的查詢時,它看起來並不漂亮。

+1

「有人用SQL了嗎?」 - 是的。 –

+0

我一直使用SQL。一旦你瞭解了ORM如何生成SQL,大部分的戰鬥都會贏。使用調試工具欄或sql日誌查看正在製作的香腸。 –

回答

2

使用Django的QuerySet API你有不同的可能性:

  • 您可以使用extra()將返回其評估模型對象的查詢集。因此,正如其名稱所述,由於某種原因而受到限制,因爲要返回模型實例,有必要例如。查詢模型的表格。但是你有可能添加額外的SQL例如。 WHEREORDER條款。例如,使用extra()的查詢集仍然可以使用類似ORM的多重鏈接filter()的功能。

  • raw()返回一個RawQueryset,它也可以迭代以獲得模型實例,但是你失去了許多ORM通常會提供的功能。

  • 當然,您可以使用low level connection cursor API(當然沒有模型實例)直接執行SQL。

研究the documentation on raw queries,還有很多信息如:如何在來自原始查詢的數據上映射模型的字段,並在將參數傳遞給查詢時記錄幾個陷阱。

還要回答你編輯的問題:當你可以用ORM做的時候,我不會使用原始的SQL,但是當然ORM是有限的,如果你需要做一些更復雜的事情,你總是需要切換到SQL(但有時使用extra()就足夠了 - 所以你仍然可以使用ORM的優點)。不要忘記,ORM可以與每個數據庫後端協同工作,而自定義SQL可能不適用於每個數據庫。

相關問題