我可以在Django模型中使用直接SQL吗?

时间:2013-08-21 12:28:58

标签: sql django

而且,如果可以,这是否意味着我失去了将结果视为对象的优势?我发现复杂的查询在许多ORM中都很混乱,而不仅仅是Django。但是,这可能是因为我从未真正使用过ORM。有没有人再使用直接SQL?

编辑:如果我完全绕过ORM,我是否会破坏拥有框架的目的?它们都有一个“漂亮”的ORM,但是当涉及到包含大量子查询,派生表的查询时,它看起来并不漂亮。

2 个答案:

答案 0 :(得分: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可能不适用于每个数据库。

答案 1 :(得分:1)

您可以使用原始SQL return objects;或者如果你想要你可以bypass the ORM completely