ORM
ORM概念
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM由来
让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。
几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。
按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是极其相似或者重复的。
ORM的优势
ORM解决的主要问题是对象和关系的映射。它通常将一个类和一张表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据。
让软件开发人员专注于业务逻辑的处理,提高了开发效率。
ORM的劣势
ORM的缺点是会在一定程度上牺牲程序的执行效率。
ORM的操作是有限的,也就是ORM定义好的操作是可以完成的,一些复杂的查询操作是完成不了。
ORM用多了SQL语句就不会写了,关系数据库相关技能退化…
ORM总结
ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。
但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。
但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。
Django中ORM的使用
类 --> 表
对象 --> 数据
属性 --> 字段
1 配置数据库
在setting.py文件中配置数据库
2 写所需数据表对应的类
在app对应的models.py文件中写上数据库中表对应的类
3 pycharm中链接及查看数据库

4 执行数据库迁移命令
#检测所有app的models.py文件变化,并将变更记录生成相应的迁移文件
python manage.py makemigrations
#数据库迁移,利用迁移文件将变更的同步数据库
python manage.py migrate

5 orm测试
定义一个功能来获取数据库相应的数据
6 通过ORM进行数据库增删改查
class Publisher(models.Model): #表名
name = models.charFiel(max_length=32) #属性名称及数据类型
#查:
from app01 import models
models.Publisher.objects.all()#查询所有数据 返回QuerySet 对象列表
models.Publisher.objects.get(name='xx',pk=1)#查询一个数据 返回数据对象 没有或者是多个数据会报错
models.Publisher.objects.filter(name='xx',pk=1)#条件查询多个数据 返回对象列表
#增:
ret = models.Publisher.objects.creat(name='xx')
#删:
models.Publisher.objects.get(pk=1).delete()#对象删除
models.PUblisher.objects.filter(pk=1).delete()#删除多个对象
#改:
pub_obj = models.Publisher.objects.get(pk=1)
pub_obj.name ='xxx'
pub_obj.save()#提交
7 模板语法
return render(request,'模板的文件名',{'k1':'xxx','all_publishers':all_publishers})
{{k1}} //'XXX'
{% for i in all_publishers %}
{{ forloop.counter }}
{{ i.name }}
{{ i.pk }}
{{ i.id }}
{% endfor %}
8 外键的创建
class Publisher(models.Model):
name = models.CharField(max_length=32)
class Book(models.Model):
name = models.CharField(max_length=32)
publisher_id = models.ForeignKey(Publisher, on_delete=models,CASCADE) #默认是级联删除
'''
on_delete 2.0版本之后必填
models.CASCADE 级联删除
models.PROTECT 保护
models.SET(v) 删除后设置为某个值
models.SETDEFAULT 删除后设置位默认值
models.SET_NULL 删除后设置为NULL
'''