Object Relational Mapping(ORM)
ORM介绍
ORM概念
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM由来
让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。
几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。
按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。
ORM的优势
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。
让软件开发人员专注于业务逻辑的处理,提高了开发效率。
ORM的劣势
ORM的缺点是会在一定程度上牺牲程序的执行效率。
ORM用多了SQL语句就不会写了,关系数据库相关技能退化...
ORM总结
ORM只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。
但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。
但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。
Django中的ORM
Model
在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表,
基本情况:
- 每个模型都是一个Python类,它是django.db.models.Model的子类。
- 模型的每个属性都代表一个数据库字段。
- 综上所述,Django为您提供了一个自动生成的数据库访问API,详询官方文档链接。
创建一个ORM过程
总结详细步骤: 1. 手动创建数据库 2. 在app/models.py里面写上一个类,必须继承models.Model这个类 (注意启动Django项目) 3. 在Django 项目的settings.py 里面 配置上数据库的相关信息 4. 在Django项目里的__init__.py里面写上 两句话 import pymysql pymysql.install_as_MySQLdb() 5. 给Django发布命令 1. python manage.py makemigrations # 相当于去你的models.py 里面看一下有没有改动 2. python manage.py migrate # 把改动翻译成SQL语句,然后去数据库执行 models.py --> Django翻译成SQL --> pymysql --> MySQL(4p)
总结一下:
models.py MySQL
类 对应 数据表
类的属性 对应 数据库里面的字段(列)
对象 对应 一行数据(一条数据)
ORM到底是什么? --> 对象关系映射
ORM操作
# 增 1. models.Tb1(表名).objects.create(c1=‘xx‘, c2=‘oo‘) # 增加一条数据,可以接受字典类型数据 **kwargs
models.Tb1(表名).objects.create(**{})
2.obj = models.Tb1(c1=‘xx‘, c2=‘oo‘) obj.save() # 查 models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议) models.Tb1.objects.all() # 获取全部 models.Tb1.objects.filter(name=‘seven‘) # 获取指定条件的数据 ,不满足条件不报错,但是返回的结果是一个对象的列表
models.User.objects.filter().first() # 获取指定条件的数据 ,的第一个
models.User.objects.filter().last()# 获取指定条件的数据,的最后一个
models.Tb1.objects.exclude(name=‘seven‘) # 去除指定条件的数据 # 删 # models.Tb1.objects.filter(name=‘seven‘).delete() # 删除指定条件的数据 # 改 1.models.Tb1.objects.filter(name=‘seven‘).update(gender=‘0‘) # 将指定条件的数据更新,均支持 **kwargs
2. obj = models.Tb1.objects.get(id=1) obj.c1 = ‘111‘ obj.save() # 修改单条数据