哪一种是在Django中进行查询的更好方法(原始查询与ORM)?

Par*_*eog 0 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'
Run Code Online (Sandbox Code Playgroud)

DJANGO ORM

现在,如果我使用Django ORM,则必须执行类似

a_obj = ModelA.objects.filter(name='localhost')
ModelB.objects.filter(some_id__in=a_obj)
Run Code Online (Sandbox Code Playgroud)

DJANGO RAW SQL /连接

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
Run Code Online (Sandbox Code Playgroud)

现在,我知道他们两个都将给我所需的结果。但是,为什么要使用一个?从我的角度来看,Django ORM必须两次命中数据库才能获取所需的信息,而原始查询只需单击一次即可获取,我认为原始查询会胜出。再次,原始查询通过使用参数化查询来防止SQL注入攻击,该参数化查询对变量进行了转义,从而防止了攻击。

很多人建议在原始查询上使用Django ORM,但是在这些情况下,我认为Django ORM不会比原始查询做得更好,也不会更糟。

因此,在记住数据库性能和安全性的同时,我应该使用哪一个?为什么呢?

dig*_*mer 5

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

简而言之,这取决于。

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

在许多情况下,RAW SQL会更高效,但是您随后将绕过ORM提供的抽象好处。

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

我的个人策略是即使在效率较低的情况下也要尽量坚持使用ORM。我不再使用Django,但是当我使用Django时,我只是在使用它来使用其电池,软件包,插件和扩展来提高开发人员的效率。如果我真的关心性能和优化,那么我不会首先使用Django。

  • 如果您编写原始 sql,您将不会通过 ORM 接口(调用签名)访问数据。这会将您的函数绑定到您选择运行的数据库,并且您将无法再将数据库从 Postgres 切换到 SQLite,而无需更新 RAW 查询。 (2认同)