ORM应用

Python publisher01 106℃

目录

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只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。
但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。
但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。

ORM 与 DB 的对应关系图

Model 模块

在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,
一个模型(model)映射到一个数据库表。
基本情况:
    每个模型都是一个Python类,它是django.db.models.Model的子类。
    模型的每个属性都代表一个数据库字段。
    综上所述,Django为您提供了一个自动生成的数据库访问API,详询官方文档https://docs.djangoproject.com/en/1.11/topics/db/queries/

ORM操作

# 获取表中所有的数据
ret = models.User.objects.all()  # QuerySet 对象列表  【对象】
for i in ret:
    print(i.xxx,i.sss)  #xxx,sss 填写要获取的字段
# 获取一个对象(有且唯一)
obj = models.User.objects.get(username='alex')   # 获取不到或者获取到多个对象会报错
print(obj.xxx,obj.sss)  ##xxx,sss 填写要获取的字段
# 获取满足条件的对象
ret = models.User.objects.filter(username='alex1',password='dasb')  # QuerySet 对象列表 #获取不到返回空列表
print(ret[0].xxx,ret[0].sss) #可以通过索引与循环取值

增删改查操作

#增
obj = models.Publisher.objects.create(name='xxx')
obj = models.Publisher(name='xxx')# 存在在内存中的对象
obj.save() # 提交到数据库中  新增
"""
book_obj = Book.objects.create(name='xxx',pub=出版社对象)
book_obj = Book.objects.create(name='xxx',pub_id=出版社对象的id)
book_obj = Book(name='xxx',pub=出版社对象)
book_obj.save() #注意区别 pub与pub_id
""""
#删
obj_list = models.Publisher.objects.filter(pk=pk)
obj_list.delete()
# Book.objects.filter(pk=1).delete()
obj = models.Publisher.objects.get(pk=pk)
obj.delete()
#改
obj = models.Publisher.objects.get(pk=1)
obj.name = publisher_name  #只是在内存中操作
obj.save()  # 保存数据到数据库中
#查
models.Publisher.objects.all()#查询所有的数据 queryset 对象列表  
models.Publisher.objects.get(name='xxxx')#对象,获取不到或者获取到多个就报错
models.Publisher.objects.filter(name='xxxx')#获取满足条件的所有的对象   queryset  对象列表   

转载请注明:Python量化投资 » ORM应用

喜欢 (0)or分享 (0)