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