美文网首页
什么是ORM?

什么是ORM?

作者: Kevin0is0me | 来源:发表于2019-05-06 13:40 被阅读0次

什么是ORM?

  MVC框架中重要的一部分就是ORM,实现了数据模型与数据库的解耦,即数据模型不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。

  ORM是对象关系映射的简称,主要任务是:

  根据对象的类型生成表结构

  将对象、列表操作,转换成SQL语句(或其他数据库的语句)

  将SQL查询到的结果转换为对象、列表

  类名对应  ------>  数据库中的表名

  类属性对应  ----->  数据库里的字段

  类实例对应  ------->  数据库表里的一行数据

  ORM的优势:

  ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句。快速开发,由此而来。

  可以避免一些新手程序猿写sql语句带来的性能问题。

  如果数据库迁移,只需要更换Django的数据库引擎即可。

  ORM的缺点:

  性能有所牺牲,不过现在的各种ORM框架都在尝试各种方法,比如缓存,延迟加载登来减轻这个问题。效果很显著。

  对于个别复杂查询,ORM仍然力不从心,为了解决这个问题,ORM一般也支持写raw sql。

  通过QuerySet的query属性查询对应操作的sql语句

  数据库的配置

  1.默认支持

  Django默认支持sqlite,mysql, oracle,postgresql数据库。默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3。

  2.mysql驱动程序

  MySQLdb(mysql python)【python2中的驱动】

  mysqlclient

  MySQL

  PyMySQL(纯python的mysql驱动程序)【python3中的驱动】

  3.创建数据库

  配置前必须先创建数据库

  1

  create database Django_books charset utf8;  #创建支持中文的数据库

  4.更改项目中settings.py的数据库设置

  + View Code

  5.配置驱动

  Django默认导入的驱动是MySQLdb,MySQLdb对python3的支持有很大问题,所以要换成PyMySQL:在项目名文件夹下的__init__.py中:

  1

  2

  import pymysql

  pymysql.install_as_MySQLdb()    # 告诉Django使用pymysql驱动程序

  扩展:查看ORM操作执行的原生sql语句,在settings.py中增加:

  + View Code

  表(模型)的创建

  示例:作者、书籍和出版社之间的关系

  + View Code

  1.每个数据模型(类)都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。

  2.每个类就相当于单个数据表,属性名就是字段名

  字段类型介绍

  + View Code

  3.字段参数介绍

  + View Code

  4.模型之间的关系(表与表之间)

  有三种关系:一对一,一对多,多对多

  一对一:实质就是在主外键的关系基础上,给外键加了一个UNIQUE=True的属性;OneToOne("UserGroup")

  一对多:就是主外键关系;ForeignKeyField("UserGroup",to_field="gid",default=1,on_delete=models.CASCADE)

  多对多:ORM会为我们自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key);ManyToManyField("UserGroup")

  参数:“UserGroup”    关联的另一张表的表名;

  to_field="gid"    可省略。另外一张表的字段,默认是主键;

  on_delete=models.CASCADE  不加这个会报错;

  5.建好表后,在命令行执行一下两条语句生成映射文件并提交数据库执行建表

  1

  2

  python manage.py makemigrations   在应用文件夹内生成映射文件(000开头的py文件)

  python manage.py migrate            提交数据库执行建表

  6.修改数据表

  如果要修改数据模型,重新执行第5步操作,可能会出现如下问题:

  如果新增字段没有默认值,或者原来表中设置了字段不能为空,这里提供两个选择,1是设置一个默认值,2是退出修改。选择1后,只要输入默认值即可。

  表的操作

  一.增添

  增添表记录

  + View Code

  增添多对多之间的关联关系

  + View Code

  二.删除

  删除表记录

  1

  Book.objects.filter(name="Python").delete()  # 看上去删除了一条消息,实际上还删除了book_author表中的数据, 这是django默认的级联删除

  删除多对多之间的关联关系

  + View Code

  三.修改

  修改表数据

  + View Code

  如果要修改多对多表之间的关系:

  1

  没有专门的方法,可以将remove()和add()组合使用

  四.查询

  1.查询API:

  + View Code

  扩展查询:有时候Django的查询API不能方便地设置查询条件,提供了另外的扩展查询方法extra()

  + View Code

  单表模糊查询:(双下划线)

  + View Code

  2.多表关联查询:(多对多和一对多没有区别)

  + View Code

  3.Queryset的惰性机制

  所谓惰性机制,models查询语句只是返回了一个Queryset对象,并不会马上执行SQL,而是使用查询结果的时候才执行。

  例如:person_set = Person.objects.filter(first_name="Dave")这句话并没有运行数据库查询,当遍历Queryset、if queryset或者在模板渲染的时候使用的时候才会执行数据库查询操作

  Qureyset的特点:可迭代、可切片、有缓存。

  ※ Queryset是有缓存的

  当遍历Queryset时,匹配的记录会从数据库获取,然后转换成Django的model。这些model会保存在Queryset内置的缓存中,如果再次遍历或者使用这个Queryset时,不需要重复的查询。

  而如果处理成千上万的记录时,一次性装入内存是非常浪费的。要避免产生Queryset缓存,可以使用iterator()方法来获取数据,处理完数据就将其丢弃。

  + View Code

  迭代器不能重复遍历,意味着可能会造成额外的重复查询。而缓存是用于减少对数据库的查询。所以使用时要考虑需求。

  4.聚合查询的分组查询

  from django.db.models import Avg,Min,Sum,Max,Count

  聚合查询:aggregate(*args,**kwargs):

  aggregate()是Queryset的一个终止子句,通过对Queryset进行计算,返回一个聚合值的字典。从整个查询集上生成聚合值。

  aggregate()子句的参数描述了我们想要计算的聚合值,如平均Avg,求和Sum等

  例如:

  + View Code

  分组查询: annotate(www.thd540.com*args,**kwargs):

  分组查询常常和聚合查询一起。它可以为查询集的每一项生成聚合。

  + View Code

  5.F查询和Q查询

  from django.db.models import F,Q

  F查询:就是用来更新获取原来值的功能

  models.Author.objects.all(www.tianzunyule178.com/).update(age=F("age")+1) # 将Author表里所有人的年龄+1

  models.Book.objects.all().update(price=F("price")+10)  # 将所有书的价格涨10元

  Q查询:用于构造复杂的查询条件,如 与、或、非。

  查询条件我们可以使用filter()方法,在filter()里面的两个条件之间是and的关系,如果是或的关系,则只能使用Q查询

  Book.objects.filter(Q(id=www.tygj178.com 1)) # 查询条件为id=1

  Book.objects.filter(Q(price=www.dfgjpt.com 99) | ~Q(name="Python")) # 查询价格=99 或 名称不等于Python的书

  Book.objects.filter(Q(name=www.dfgj157.com "Go"),price=99)  # Q查询可以和关键字查询组合使用,但必须要将Q放到前面

相关文章

  • Hibernate初探之单表映射

    什么是ORM ORM(Object/Relationship Mapping):对象/关系映射 为什么需要ORM ...

  • 什么是ORM?

    对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数...

  • 什么是orm

    对象关系映射:是一种为了解决面向对象和关系数据库存在的互相不匹配的现象技术。可以使用采用硬编码的方式(jdbc操作...

  • 什么是ORM

    ORM ( Object / Relationship Mapping ) : 对象/关系映射jdbc模式利用面向...

  • 什么是【ORM】

    ORM(Object Relational Mapping)是对象关系映射的英文简称。它是通过描述对象和数据库之间...

  • 什么是ORM?

    什么是ORM? MVC框架中重要的一部分就是ORM,实现了数据模型与数据库的解耦,即数据模型不需要依赖于特定的数据...

  • 什么是ORM?为什么要用ORM?

    了解orm,先了解以下概念: 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可...

  • Python:使用元类实现 orm & sqlalchemy 连

    1. orm 什么是 orm-- 对象关系映射(Object Relational Mapping,简称ORM)是...

  • Swoft ORM AR 活动记录

    什么是ORM? ORM(Object Relational Mapping, ORM, O/RM, O/R map...

  • Django ORM详解

    Django ORM详解 什么是ORM? ORM,即Object-Relational Mapping(对象关系映...

网友评论

      本文标题:什么是ORM?

      本文链接:https://www.haomeiwen.com/subject/uoproqtx.html