欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

【Django】django使用原生SQL的方法(附加说说为什么ORM上不了大台面)

发布时间:2023/12/20 74 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【Django】django使用原生SQL的方法(附加说说为什么ORM上不了大台面) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
  • 执行自定义SQL语言:

    from django.db import connection ​ cursor=connection.cursor() ​ # 插入操作 cursor.execute("insert into hello_author(name) values('传说中的申小五')") ​ # 更新操作 cursor.execute("update hello_author set name='abc' where name='bcd'") ​ # 删除操作 cursor.execute("delete from hello_author where name='abc'") ​ # 查询操作 cursor.execute("select * from hello_author") ​ raw=cursor.fetchone() # 返回结果行游标直读向前,读取一条 cursor.fetchall() # 读取所有
  • 使用raw:

    Book.objects.raw('select * from hello_Book') # 返回模型实例
  • 使用extra:

    models.Book.objects.filter(publisher__name='传说中的申小五').extra(where=['price>50']) models.Book.objects.filter(publisher__name='传说中的申小五', price__gt=50) models.Book.objects.extra(select={'count': 'select count(*) from hello_Book'})
  •  


    个人觉得因为原生Django的orm ​比 SQLAlchemy简单。所以用它。

     

    Django ORM 的优点

    • 1. 遵循 Active Record 模式,对业务相对来说简单一些的网站来说,对外暴露了简简单单的 OO 操作方式?连 GroupBy 的写法都看不出来 SQL 的痕迹。
    • 2. 对于没上手 SQL 的人来说,照着文档撸代码, 稍微懂一点点SQL, 谈笑间简直就是 Python 一波速推流,简单而暴力

    缺点

    • 1. 没有 Unit Of Work, 这就导致了你需要大量的依据情况来一个一个object的save
    • 2. 没有 Identity Map, 这就导致了会产生很多duplicated 的sql语句 如果你做跨三个表的查询的时候,这个现象就特别明显. 通过 django debug tools 就可以看出来, 当然, 通过 select related 和 prefetch related 也能缓解一下. 或者是走local cache 间接的使用 SQLA
    • 3. JOIN 写起来比较固定。最后发现大部分 JOIN 还是要写 RAWSQL

     

    当然, 上面列的django orm的缺点, 其实sqla帮你解决了大部分

    SQLAlchemy 是更加复杂的 ORM 框架,遵循 DataMapper,SQLA 实现了 Unit Of Work , IdentityMap , 对于业务复杂的场景来说,有更好的适应性。

    但, 虽然说sqla这么多优点吧, 但架不住复杂到1000多页的使用说明

    总结

    以上是生活随笔为你收集整理的【Django】django使用原生SQL的方法(附加说说为什么ORM上不了大台面)的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。