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不出这样的表):

表:姓名,性别,电话

问题:若某个人有两个电话,家庭电话和手机,这样则不符合第一范式。

解决:把电话列分成两个列即可。

不符合第二范式的例子:

表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;

这个表明显说明了两个事务:学生信息, 课程信息,不符合第二范式。

存在问题:数据冗余,每条记录都含有相同信息。

解决:分成学生表和课程表分别存储即可。

不符合第三范式的例子:

学号, 姓名, 年龄, 所在学院, 学院联系电话,关键字为单一关键字"学号";

存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)

存在问题:

数据冗余:有重复值;

解决:分成学生表,学院表即可。

原文地址:https://www.cnblogs.com/mqhpy/p/11959753.html