【问题标题】:Which is a better way to query in Django (Raw query vs ORM)? [closed]哪个是在 Django 中查询的更好方法(原始查询与 ORM)? [关闭]
【发布时间】: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 并没有比原始查询做得更好,而且并不差。

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

【问题讨论】:

    标签: python mysql django orm


    【解决方案1】:

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

    简而言之,这取决于。

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

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

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

    我个人的策略是尽可能地坚持使用 ORM,即使在效率较低的情况下也是如此。我不再使用 Django,但是当我使用 Django 时,我只是为了使用它的电池、包、插件和扩展来提高开发人员的效率。如果我真的关心性能和优化,我一开始就不会使用 Django。

    【讨论】:

    • 当您说抽象的好处时,您通俗地说是什么意思?抱歉,我对 Django 有点陌生。
    • 如果您编写原始 sql,您将不会通过 ORM 接口(调用签名)访问数据。这会将您的函数绑定到您选择运行的数据库,并且您将无法再将数据库从 Postgres 切换到 SQLite,而无需更新您的 RAW 查询。
    • 这意味着,假设我有一个主从数据库架构。通常 Django 模型会处理从 slave 的读取,插入到 master 中。但是,原始查询不会处理这个问题,我们必须修改原始查询才能这样做?
    猜你喜欢
    • 2021-12-19
    • 2018-05-15
    • 1970-01-01
    • 2021-09-23
    • 2019-08-05
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多