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不会比原始查询做得更好,也不会更糟。
因此,在记住数据库性能和安全性的同时,我应该使用哪一个?为什么呢?
这是我对Django中的ORM与RAW SQL的一般观点,也许并不受欢迎。
简而言之,这取决于。
在使用Django的大多数开发人员中,ORM是一个常见的转换点。大多数Django开发人员都会对Django orm感到满意。大多数教程,插件和示例都利用orm与数据库进行接口。我什至见过一些初级开发人员,他们甚至都不了解SQL查询,只知道如何使用ORM。
在许多情况下,RAW SQL会更高效,但是您随后将绕过ORM提供的抽象好处。
如果您真正关心优化,那么RAW SQL是不可避免的,但是如果您更关心(取决于团队)一致性和利用抽象,那么请坚持使用ORM。
我的个人策略是即使在效率较低的情况下也要尽量坚持使用ORM。我不再使用Django,但是当我使用Django时,我只是在使用它来使用其电池,软件包,插件和扩展来提高开发人员的效率。如果我真的关心性能和优化,那么我不会首先使用Django。