Django-ORM和MySQL事务及三大范式介绍
Django中操作操作数据库这里需要改一个数据:

模型层:就是与跟数据库打交道
ORM查询:
一、单表操作必知必会13条:
orm默认都是惰性查询:
1.all() 查询所有
2.filter() 筛选条件 条件之间是and关系 条件不存在不报错

3.get() 直接返回数据对象本身 条件不存在直接报错 不推荐使用

4.first() 取queryset中第一个元素对象

5.last() 取queryset中最后一个元素对象

6.count() 计数

7.values() 根据指定的字段 获取指定的值 列表套字典

8.values_list() 根据指定的字段 获取指定的值 列表套元祖

9.order_by() 按照指定字段排序 默认是升序 在字段前面加一个负号就是降序

10.reverse() 反转 前提是前面的数据必须是有序的(排序)

11.exclude() 排除什么什么在外

12.exists() 判断结果是否有值 返回的是布尔值类型

13.distinct() 去重 数据必须是一模一样的 主键也包含在内
二、神奇的双下划綫查询:
1.__gt 大于:

2.__lt 小于

3.__gte

4.__lte

5.__in

6.__range

7.__startswith

8.__endswith

9.__contains 默认是区分大小写的

10.__icontains 忽略大小写

11.__year

12.__month

三、外键字段的增删改查一对多字段:
增


改:


四、多对多字段的增删改查:
增方法
操作多对多的时候先查找到关联的表,然后进行点关联字段跨到第三张表,具体操作看下面图片:

由上面的代码我们可以发现,add方法能朝第三张表关系添加数据的时候,即支持传数字add(1,2),同时也支持传对象add(author_obj,author_obj1),并且两者都之处传多个。
改方法
多对多表操作的改方法,是有的set方法。这里我们需要特别注意的地方时,我们给set传值得时候必须是一个可迭代对象,同时他也可以传数字和传对象的,同时也之处穿多个。

删方法
多对多表操作的删方法,是用的remove方法。既可以传数字也可以传对象,并且也支持传多个,不需要传可迭代对象,详情看下下面的代码:

清空clear 删除某个数据在第三张表中的所有数据,括号内不需要传递参数

查方法
查的时候分为正向查询和反向查询,
正向查询是,关键字在哪个表,由哪个表开始发起查找就是正向查找,反之就是反向查找。
正向查询方法是,按照字段查找;反向查询是按表名小写加_set。
正向查询:



从上面的代码中我们看到有的地方加了all()。什么时候需要加all呢!当正向查询点击外键字段数据有多个的情况下,只需要.all()。当你看到APP01.Author.None,一旦你看到报这样的关键字,只需要加.all()即可。
注意:在写ORM的时候要跟写sql语句一样,不要想一次性全部写完,可以写一点查一点再写一点,循序渐进的写,把复杂的语句分层去写。
反向查询:



注意:一对多和多对多的反向查询的时候是表名小写加_set,但是一对一的时候就不需要加_set了。
基于双下划线的跨表查询,(联表操作),下面我们看下几个例子(重点)




五、ORM查询优化
数据库查询优化相关:
1.only与defer


2.select_related与prefetch_related
select_related括号内只能放外键字段 并且外键字段的类型只能是一对多 或者 一对一 不能是多对多,内部是自动连表操作 会将括号内外键字段所关联的表 与当前表自动拼接成一张表,然后将表中的数据一个个查询出来封装成一个个的对象,这样做的好处就在于跨表也不需要重复的走数据库了 减轻数据库的压力,select_related括号内可以放多个外键字段 都号隔开 会将多个外键字段关联的表与当前表全部拼成一张大表,

注意:耗时: 数据库层面需要先连表 。
prefetch_related内部是子查询会自动帮你按步骤查询多张表 然后将查询的结果封装到对象中给用户的感觉好像还是连表操作括号内支持传多个外键字段 并且没有类型限制特点:每放一个外键字段 就会多走一条sql语句 多查询一张表

注意:耗时:查询的次数长
两者之间的优缺点结合实际情况 表的大小两张表都特别大的情况下 连表操作 可能耗时更多。
六、choices
choices参数
用在一些字段数据是可以明确列出所有可能的,例如:性别、工作经验、学历等等。
1.先提前定义好对应关系
2.再通过字段的choices参数来指定关系
eg:
dender_choices=(
(1,'male'),
(2,'female')
(3,'other')
)
gender = models.IntergerField(choices = gender_choices),将choices字段写入数据库
但是一旦你存储的数据在你实现定义好得范围内。就可以利用get_字段_display()拿到对应的解释信息
七、什么是事务,MySQL如何支持事务:
什么是事务?
事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元)
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。
(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分的特征一样。事务是应用中不可再分的最小逻辑执行体。(最小了,不可再分了)
(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(说罢了就是白狗变成了黑狗,不能出现斑点狗!)
(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。(说白了,就是你做你的,我做我的!)
(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(说白了就是一条道跑到黑)
MySQL如何支持事务?
MYSQL的事务处理主要有两种方法
1.用begin,rollback,commit来实现
begin开始一个事务
rollback事务回滚
commit 事务确认
2.直接用set来改变mysql的自动提交模式
mysql默认是自动提交的,也就是你提交一个query,就直接执行!可以通过
set autocommit = 0 禁止自动提交
set autocommit = 1 开启自动提交
来实现事务的处理
八、简述数据库三大范式:
第一范式(1NF):原子性 字段不可再分,否则就不是关系数据库;
第二范式(2NF):唯一性 一个表只说明一个事物;
第三范式(3NF):每列都与主键有直接关系,不存在传递依赖;
PS:第二范式要遵循第一范式,第三范式要遵循第二范式。
简单来说:
1NF:列表字段不可分;
2NF:有主键且非主键依赖主键;
3NF:非主键字段不能相互依赖;
不符合第一范式的例子(关系数据库中create不出这样的表):
表:姓名,性别,电话
问题:若某个人有两个电话,家庭电话和手机,这样则不符合第一范式。
解决:把电话列分成两个列即可。
不符合第二范式的例子:
表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;
这个表明显说明了两个事务:学生信息, 课程信息,不符合第二范式。
存在问题:数据冗余,每条记录都含有相同信息。
解决:分成学生表和课程表分别存储即可。
不符合第三范式的例子:
学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号";
存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)
存在问题:
数据冗余:有重复值;
解决:分成学生表,学院表即可。
Django-ORM和MySQL事务及三大范式介绍的更多相关文章
- Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置
数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...
- MySQL数据库的三大范式定义,作用—------你所期待的最佳答案
第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名.编号.地址.……)其中"地址"列还可 ...
- django----中使用事务 数据库的三大范式
目录 orm中的事务操作 ⑴ 原子性(Atomicity) ⑵ 一致性(Consistency) ⑶ 隔离性(Isolation) ⑷ 持久性(Durability) django中使用事务 数据库三 ...
- Django ORM 数据库操作
比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 ...
- MySQL 事务常见面试题总结 | JavaGuide 审核中
<Java 面试指北>来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计.常见框架.分布式.高并发 ......).优质面经等内容. 本文原发于 MySQL知识点&am ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- MySQL(三)之SQL语句分类、基本操作、三大范式
一.SQL语句的分类 DML(Data Manipulation Langauge,数据操纵/管理语言) (insert,delete,update,select) DDL(Data ...
- MySql三大范式与数据库设计和表创建常用语句
[数据库设计的三大范式] 1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元.也就是确保每一列的原子性. 例如: userInfo: ...
- django中使用mysql数据库的事务
django中怎么使用mysql数据库的事务 Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起 ...
随机推荐
- python高级 之(二) --- 类装饰器
装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...
- 差分+贪心:IncDec序列
原题 题目描述给定一个长度为 n 的数列 a1,a2,…,ana1,a2,…,an,每次可以选择一个区间 [l,r][l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列 ...
- IE11兼容IE8的设置
我们在使用ie11浏览器的时候,有些网站的兼容性不是太好,这个时候就要设置下ie11的兼容性了.那么ie11浏览器怎么设置兼容IE8呢?下面就让小编给大家介绍一下吧. 首先我们打开电脑里面的ie11浏 ...
- CDH6.2安装之离线方式
参考: https://www.cnblogs.com/swordfall/p/10816797.html 下载parcels: https://archive.cloudera.com/cdh6/6 ...
- 【Python】【demo实验1】【Python运行时强制刷新缓冲区,输出信息】(Python3 应不存在类似情况)
[原文] 需求:打印一颗 ”*” 休息1s 代码如下: #!/usr/bin/python #coding=utf-8 ''' 暂停1s输出 ''' import time def printStar ...
- __metaclass__方法
metaclass这个属性叫做元类,它是用来表示这个类是由谁来帮他实例化创建的,说白了,就是相当于自己定制一个类. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- python网络编程-socket套接字通信循环-粘包问题-struct模块-02
前置知识 不同计算机程序之间数据的传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...
- 使用mybatis插件自动生成代码以及问题处理
1.pom.xml中加入依赖插件 <!-- mybatis generator 自动生成代码插件 --> <plugin> <groupId>org.mybatis ...
- 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项
混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...
- 链式栈的C++实现
这是去年的内容,之前放在github的一个被遗忘的reporsity里面,今天看到了就拿出来 #include<iostream> #include<string> using ...