什么是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的数据库设置
  
  +
  
  5.配置驱动
  
  Django默认导入的驱动是MySQLdb,MySQLdb对python3的支持有很大问题,所以要换成PyMySQL:在项目名文件夹下的__init__.py中:
  
  1
  
  2
  
  import pymysql
  
  pymysql.install_as_MySQLdb()    # 告诉Django使用pymysql驱动程序
  
  扩展:查看ORM操作执行的原生sql语句,在settings.py中增加:
  
  +
  
  表(模型)的创建
  
  示例:作者、书籍和出版社之间的关系
  
  +
  
  1.每个数据模型(类)都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。
  
  2.每个类就相当于单个数据表,属性名就是字段名
  
  字段类型介绍
  
  +
  
  3.字段参数介绍
  
  +
  
  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后,只要输入默认值即可。
  
  表的操作
  
  一.增添
  
  增添表记录
  
  +
  
  增添多对多之间的关联关系
  
  +
  
  二.删除
  
  删除表记录
  
  1
  
  Book.objects.filter(name="Python").delete()  # 看上去删除了一条消息,实际上还删除了book_author表中的数据, 这是django默认的级联删除
  
  删除多对多之间的关联关系
  
  +
  
  三.修改
  
  修改表数据
  
  +
  
  如果要修改多对多表之间的关系:
  
  1
  
  没有专门的方法,可以将remove()和add()组合使用
  
  四.查询
  
  1.查询API:
  
  +
  
  扩展查询:有时候Django的查询API不能方便地设置查询条件,提供了另外的扩展查询方法extra()
  
  +
  
  单表模糊查询:(双下划线)
  
  +
  
  2.多表关联查询:(多对多和一对多没有区别)
  
  +
  
  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()方法来获取数据,处理完数据就将其丢弃。
  
  +
  
  迭代器不能重复遍历,意味着可能会造成额外的重复查询。而缓存是用于减少对数据库的查询。所以使用时要考虑需求。
  
  4.聚合查询的分组查询
  
  
  from django.db.models import Avg,Min,Sum,Max,Count
  
  聚合查询:aggregate(*args,**kwargs):
  
  aggregate()是Queryset的一个终止子句,通过对Queryset进行计算,返回一个聚合值的字典。从整个查询集上生成聚合值。
  
  aggregate()子句的参数描述了我们想要计算的聚合值,如平均Avg,求和Sum等
  
  例如:
  
  +
  
  分组查询: annotate(www.thd540.com*args,**kwargs):
  
  分组查询常常和聚合查询一起。它可以为查询集的每一项生成聚合。
  
  +
  
  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放到前面

什么是ORM?的更多相关文章

  1. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  2. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  3. UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

    选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...

  4. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

  5. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  6. CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用

    Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...

  7. CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用

    背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...

  8. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  9. 最好的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  10. Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM

    产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...

随机推荐

  1. SpringBoot 项目打包分开lib,配置和资源文件

    原文地址:https://blog.csdn.net/u012811805/article/details/80878848 1 jar启动分离依赖lib和配置 先前发布boot项目的时候,改动一点东 ...

  2. 小容量的byteBuffer 读取大文本

    利用死循环和判断是否 读到0个字节,便能判断是否读取完成,但它存在如下问题,如果输入是中文的话,可能没有读取完中文的全部3个字节,导致乱码.如果数据足够随机,这样的情况肯定会出现的 @Test pub ...

  3. 【题解】Luogu P4867 Gty的二逼妹子序列

    原题传送门 同Luogu P4396 [AHOI2013]作业 询问多了10倍,但还能跑过(smog #include <bits/stdc++.h> #define N 100005 # ...

  4. PHP遍历二叉树

    遍历二叉树,这个相对比较复杂. 二叉树的便利,主要有两种,一种是广度优先遍历,一种是深度优先遍历. 什么是广度优先遍历?就是根节点进入,水平一行一行的便利. 什么是深度优先遍历呢?就是根节点进入,然后 ...

  5. Oracle插入语句日期格式设置

    insert into test values (1,'2015-01-01'); 直接设置成字符串,会报出“文字与格式字符串不匹配”的异常: 如果正确插入,则要将字符型数据转成日期型数据: 1 in ...

  6. qt连接数据库Sqlite

    #include <QCoreApplication> #include <QDebug> #include <QSqlDatabase> #include < ...

  7. Qt源码学习之信号槽

    Qt源码版本 Qt 5.12.0 moc文件 Qt在编译之前会分析源文件,当发现包含了Q_OBJECT宏,则会生成另外一个标准的C++源文件(包含Q_OBJECT宏实现的代码,文件名为moc_+原文件 ...

  8. Apache Solr入门教程(转)

    1.为什么选择Apache Solr Apache Solr是一个功能强大的搜索服务器,它支持REST风格API.Solr是基于Lucene的,Lucene 支持强大的匹配能力,如短语,通配符,连接, ...

  9. centos7 mysql数据库的安装与使用

    一:数据库的安装 第一步 下载数据库到主机,, 第二步 通过xshell将数据库压缩包上传至centos7虚拟主机(#注意:服务器主机需下载上传工具lrzsz   命令:yun -y install ...

  10. Python3爬虫相关软件,库的安装

    Anaconda 百度搜Anaconda清华,根据环境选择版本下载 安装时记得勾选添加到环境变量,不要还要手动添加 Anaconda Navigator可视化界面,可以方便地调用Jupyter等工具. ...