【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上不了大台面)相关推荐
- django中使用原生sql
django中使用原生sql from django.db import connection cursor = connection.cursor() cursor.execute(& ...
- django执行原生SQL语句
1.原生SQL用法概述 django可以执行原生SQL语句,主要分读和写两类,用法如下: 读(查):xxxModel.object.raw() 写(增删改):connection.cursor() 2 ...
- django 使用原生SQL语句反向生成MODELS.PY中的表结构
在一次工作中,有这么一个问题,就是要导入的数据字段不确定,但是还想使用django的ORM来对数据进行操作.. 琢磨了许久,弄个不完善的方案,但功能是能实现的,主要是思路.废话不多说了,丑陋的展示一下 ...
- 左外连接的sql语句_Django数据库连接和使用原生sql语句
在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django连接数据库,不需要单独的创建一个连接对象.只需要在 settings.py 文件中做好数据库相关的配置就可以 ...
- EFCore之执行原生SQL语句
EFCore通过 LINQ 语法为我们提供了非常便利的方式来操作数据库. 当有些业务逻辑较复杂而不能使用 LINQ 来查询时,可以使用原生 SQL 查询. 或者使用 LINQ 查询导致 SQL 查询效 ...
- Django中一个项目使用多个数据库(原生sql 的使用,亲测)
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...
- python命令行调试django代码_Django shell调试models输出的SQL语句方法
在settings.py里,配置如下logging: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': ...
- django使用mysql原始语句,Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...
- django mysql sql语句_Django中使用mysql数据库并使用原生sql语句操作
Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...
最新文章
- Jacobian矩阵的几何意义
- bzoj 1086: [SCOI2005]王室联邦
- ORACLE JET BASIC TABLE
- HBase thrift C++编程
- 稳定菜篮子市场供需 农业大健康-林裕豪:从玉农业全力保障
- 【技术种草】介绍一款开源电商网站的购物车添加功能的实现
- 使用Quartz来实现动态定时任务
- 李洪强iOS经典面试题30-一个区分度很大的面试题
- 计算机论文的主要研究方法有哪些,9大实用的论文研究方法盘点
- 【Java面试题】一次完整的Http请求过程(非常详细)
- 机房(计算机室)管理制度,湖南石油化工职业技术学院-信息资源中心-管理制度-计算机机房管理制度...
- 晶振的匹配电容计算公式
- 腾讯云--添加二级域名
- 连接数据线截图/截视频
- 进击zheng项目zheng-umps-server
- 2021腾讯前端笔试实习生
- JavaScript数组map方法
- word快捷键复制粘贴无法使用
- 陈果“有空来坐坐...”
- linux 桌面显示 kvm,Linux的桌面虚拟化技术KVM(五)——virsh常用命令