哪个是在Django中查询的更好方法(Raw query vs ORM)?

时间:2017-03-30 14:03:11

标签: python mysql django orm

我正在使用MySQL,我有两个模式,我必须在多个模式上执行加入,正如您可能知道的那样,不支持使用Django ORM。

因此,这是针对此方案的最简化的SQL查询

SELECT * FROM db1.a AS a
JOIN db2.b AS b 
ON b.some_id = a.id
WHERE a.name = 'localhost'

DJANGO ORM

现在,如果我使用Django ORM,我将不得不做类似

的事情
a_obj = ModelA.objects.filter(name='localhost')
ModelB.objects.filter(some_id__in=a_obj)

DJANGO RAW SQL / CONNECTION

from django.db import connection

sql = 'SELECT * FROM db1.a AS a
       JOIN db2.b AS b 
       ON b.some_id = a.id
       WHERE a.name = %s'
cursor = connection.cursor()
try:
      cursor.execute(sql, ['localhost'])
      row = cursor.fetchall()
except Exception as e:
      cursor.close

现在,我知道他们俩都会给我所需的结果。但是,为什么要使用另一个呢?从我看到的情况来看,Django ORM将不得不两次访问数据库以获取所需的信息,而原始查询可以通过一次点击获得它,在我看来原始查询获胜。同样,原始查询通过使用参数化查询来防止sql注入攻击,参数化查询会转义变量,从而防止攻击。

很多人建议在原始查询中使用Django ORM,但是,在这些情况下,我没有看到Django ORM做得比Raw查询更好,它不会更糟。

那么,我应该使用哪一个,牢记数据库性能和安全性?为什么?

1 个答案:

答案 0 :(得分:4)

这是我对Django中ORM与RAW SQL的一般性,也许不受欢迎的观点。

简而言之,取决于。

ORM是大多数使用Django的开发人员中的常见转换点。大多数Django开发人员都会对Django orm感到满意。大多数教程,插件和示例都利用orm与数据库进行交互。我甚至见过一些甚至不知道SQL查询但只知道如何使用ORM的初级开发人员。

RAW SQL在很多情况下会更有效率,但是你会绕过ORM提供的抽象优势。

如果您真的关心优化,那么RAW SQL将是不可避免的,但如果您更关心(取决于团队)一致性并利用抽象,那么坚持使用ORM。

我的个人策略是尽可能多地使用ORM,即使效率较低也是如此。我不再使用Django,但是当我使用Django时,我只是使用它来使用它的电池,软件包,插件和扩展来提高开发人员的效率。如果我真的关心性能和优化,我首先不会使用Django。