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事务及三大范式介绍的更多相关文章

  1. Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置

    数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...

  2. MySQL数据库的三大范式定义,作用—------你所期待的最佳答案

    第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名.编号.地址.……)其中"地址"列还可 ...

  3. django----中使用事务 数据库的三大范式

    目录 orm中的事务操作 ⑴ 原子性(Atomicity) ⑵ 一致性(Consistency) ⑶ 隔离性(Isolation) ⑷ 持久性(Durability) django中使用事务 数据库三 ...

  4. Django ORM 数据库操作

    比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 ...

  5. MySQL 事务常见面试题总结 | JavaGuide 审核中

    <Java 面试指北>来啦!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计.常见框架.分布式.高并发 ......).优质面经等内容. 本文原发于 MySQL知识点&am ...

  6. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  7. MySQL(三)之SQL语句分类、基本操作、三大范式

    一.SQL语句的分类     DML(Data Manipulation Langauge,数据操纵/管理语言) (insert,delete,update,select)     DDL(Data ...

  8. MySql三大范式与数据库设计和表创建常用语句

    [数据库设计的三大范式] 1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元.也就是确保每一列的原子性. 例如: userInfo: ...

  9. django中使用mysql数据库的事务

    django中怎么使用mysql数据库的事务   Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起 ...

随机推荐

  1. 解决vmware fusion + centos 7安装vmtools时提示The path "" is not a valid path to the xxx kernel headers.

    近日使用VMware fushion 8 + centos 7.0时,无法使用共享功能,所以必须安装vmtools.但是安装过程中有2个错误需要解决. 1.gcc错误 Searching for GC ...

  2. python基础 --- 难点重点

    循环嵌套 # 打印九九乘法表 for row in range(1,10): # 行与列相乘 for col in range(1,row+1): print(col,'*',row,'=',row ...

  3. SQLServer2008R2复制发布订阅(含局域网跨网段)调试总结

    需要注意的问题点: 一.发布服务器A和订阅服务器B都在同一个网段的局域网内 1.两台服务器的SQLServer版本必须一致. 2.两服务器之间访问没难度,直接就可以搜索到. 3.注意请求订阅和推送订阅 ...

  4. 【Python开发】增强的格式化字符串format函数

    自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和 ...

  5. nginx反向代理集群配置

    #user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log notice;#error_l ...

  6. Laravel关联模型

    public $timestamps = false;//不存时间 1.多对多关联.如收藏.用户表users,产品表products,收藏中间表user_favorite_products.那么在用户 ...

  7. Django2.2 会话技术cookie session token的区别以及实例介绍

    一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...

  8. [转帖]How does a CPU work?

    How does a CPU work? https://milapneupane.com.np/2019/07/06/how-does-a-cpu-work/ CPU, also known as ...

  9. liunx 安装rsync

    新建一个rsync.s文件,把下面的代码写入文件里: #!/usr/bin/env bash mkdir -p /data/app/rsync/etc/ mkdir -p /data/logs/rsy ...

  10. 纯H5 AJAX文件上传加进度条功能

    上传代码js部分 //包上传 $('.up_apk').change(function () { var obj = $(this); var form_data = new FormData(); ...