ORM与惰性机制

那么首先要知道什么是ORMjavascript

专业化的角度来讲:叫对象关系映射(Object-Relation Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。html

那具体ORM是什么呢?:(在django中,根据代码中的类自动生成数据库的表也叫--code first)ORM:java

 

ORM在面向对象模型与关系模型之间架起桥梁。mysql

经过对象与数据库之间映射的元数据,自动透明地把编译语音中的对象持久化到关系数据库里,对数据库的操做能够转换为对对象的操做sql

 

到目前为止,当咱们的程序设计到数据库相关操做时,咱们通常都会这么搞:数据库

先建立数据库,设计表结构和字段,使用列如mysqldb这类的模块来链接数据库,django

并编写数据访问层代码缓存

业务逻辑层去调用数据访问层执行数据库操做架构

三层架构详解app

 简单说,ORM 就是经过实例对象的语法,完成关系型数据库的操做的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。

ORM 把数据库映射成对象。

  • 数据库的表(table) --> 类(class)
  • 记录(record,行数据)--> 对象(object)
  • 字段(field)--> 对象的属性(attribute)

举例来讲,下面是一行 SQL 语句。

SELECT id, first_name, last_name, phone, birth_date, sex FROM persons WHERE id = 10

程序直接运行 SQL,操做数据库的写法以下。

res = db.execSql(sql); name = res[0]["FIRST_NAME"];

改为 ORM 的写法以下。

p = Person.get(10); name = p.first_name;

 

总结起来,ORM 有下面这些优势

  • 数据模型都在一个地方定义,更容易更新和维护,也利于重用代码。
  • ORM 有现成的工具,不少功能均可以自动完成,好比数据消毒、预处理、事务等等。
  • 它迫使你使用 MVC 架构,ORM 就是自然的 Model,最终使代码更清晰。
  • 基于 ORM 的业务代码比较简单,代码量少,语义性好,容易理解。
  • 你没必要编写性能不佳的 SQL。

 

可是,ORM 也有很突出的缺点

  • ORM 库不是轻量级工具,须要花不少精力学习和设置。
  • 对于复杂的查询,ORM 要么是没法表达,要么是性能不如原生的 SQL。
  • ORM 抽象掉了数据库层,开发者没法了解底层的数据库操做,也没法定制一些特殊的 SQL。

 

Django惰性机制

所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会立刻执行sql,而是当调用QuerySet的时候才执行。

惰性机制之可迭代

1
2
3
# objs=models.Book.objects.all() # [obj1,obj2,ob3...]
for obj in objs: # 每一obj就是一个行对象,此时会执行sql
#     print("obj:",obj)

惰性机制之可切片

1
2
3
4
# objs=models.Book.objects.all() # [obj1,obj2,ob3...]
# print(objs[1])
# print(objs[1:4])
# print(objs[::-1])

惰性机制之Django缓存问题

    Django有本身的缓存,若是2次的obj对象一致,第二次的查值直接从缓存中取值。

    若是期间数据库的内容做了更改,则须要从新查值。不然容易产生脏数据。

    能够直接利用第一次的obj对象直接进行update操做,这样下次for循环查询时又从新执行了数据库查询操做,此时缓存也做了更改; 也能够从新手动查询一下结果,可是不推荐这样,由于咱们并不知道数据何时会进行修改,妥善的仍是Django用数据时本身去查询数据结果

 

若是2次操做之间有数据进行了修改 ,则须要从新从数据库中查值,不然Django会从缓存中取出数据,影响最后的查询结果

相关文章
相关标签/搜索