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