【发布时间】:2017-08-24 12:24:18
【问题描述】:
我正在使用 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 原始 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
现在,我知道他们都会给我所需的结果。但是,为什么要使用其中一个呢?据我所见,Django ORM 必须两次访问数据库才能获得所需的信息,而原始查询只需一次点击即可获得,在我看来,原始查询胜出。同样,原始查询通过使用参数化查询来防止 sql 注入攻击,它会转义变量,从而防止攻击。
很多人建议使用 Django ORM,而不是原始查询,但是,在这些场景中,我认为 Django ORM 并没有比原始查询做得更好,而且并不差。
那么,我应该使用哪一个,同时牢记数据库性能和安全性?为什么?
【问题讨论】: