0
点赞
收藏
分享

微信扫一扫

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

老王420 2022-09-23 阅读 166


执行自定义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多页的使用说明

举报

相关推荐

0 条评论