ORM
ORM介绍
ORM概念:
对象关系映射,是为了解决面向对象与关系数据库存在互不匹配现象的技术,简单的说ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动转化到关系数据库中,ORM在业务逻辑层和数据层之间充当了桥梁的作用
ORM的由来
"O"表达的是对象(Object)的意思,"R"则是关系(Relational)。按照之前的方法来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除、这些代码旺旺都是重复写的
ORM的优点:
ORM解决的主要问题是对象和关系的映射。它将一个类和一个表意义对应,类的实例化对应表中的一条记录,ORM提供了数据库映射,不用直接写SQL语句只需操作对象一样从数据库操作数据。
ORM的缺点:
ORM的缺点是会一定程度上牺牲程序的执行效率,可能会降低程序员对SQL的熟练度,导致数据库相关技能的退化。
映射关系:
表名 <-------------->类名 字段 <------------->属性 表记录 <-------------->类实例化对象
django中的model
在django中model是数据的单一,明确的信息来源,包含了存储的数据的重要字段和行为,通常一个model映射到一个数据库表,每一个model都是一个python类,是django.db.model,Model的子类
字段:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 username = models.CharField(max_length=32) class Group(models.Model): # 自定义自增列 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767 IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正整数 0 ~ 2147483647 BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field) - 布尔值类型 NullBooleanField(Field): - 可以为空的布尔值 CharField(Field) - 字符类型 - 必须提供max_length参数, max_length表示字符长度 TextField(Field) - 文本类型 EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6 - 参数: protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6" unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both" URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字 UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能 - 参数: path, 文件夹路径 match=None, 正则匹配 recursive=False, 递归下面的文件夹 allow_files=True, 允许文件 allow_folders=False, 允许文件夹 FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录 - 参数: upload_to = "" 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage width_field=None, 上传图片的高度保存的数据库字段名(字符串) height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field) - 浮点型 DecimalField(Field) - 10进制小数 - 参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) - 二进制类型
创建数据库,创建表步骤:
- 首先手动创建一个数据库
- 在app/models.py 里面写类,必须继承models.Model这个类,每个类就是一个数据表
- 在setting文件里面配置数据库相关信息
- 在项目下的__init__.py文件里写上:import pymysql pymysql.install_as_MySQLdb()
- 在Django中执行两条命令:
- python manage.py makemigrations#x相当于去你的models.py里面看一下有没有改动
- python manage.py migrate 吧models翻译成SQL语句,然后在数据库执行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':"school" , 'USER':"root", 'PASSWORD':" ", 'PORT':"3306" } } 因为我的数据库没有密码,所以PASSWORD后面为空
models的写法:
- 通过建一个类(继承models.Model) -->相当于创建了一个表
- 字段:
- models.AutoField(primary_key=True) -->int 自增的主键
- models.CharField(max_length=32,null=True) -->varchar(32)
- models.IntegerField() --->int
操作表:增、删、改、查(单表):
增(两种):
- models.User.objects.create(create(**{})) ---------->直接创建并且提交到数据库
- user=models.User(**{})
user.save() ------------>将新建得对象赋值到变量用save提交
删:
找到对象直接删除
models.User.objects.filter().delete()
改(类似增,两种方式):
- models.User.objects.filter().update(username="一枝花")
- user=models.User.objects.get(id=1)
user.username="一枝花"
user.save()
查(初识):
- models.User.objects.all() ------>表中全部数据
- models.User.objects.get(条件) ------->不满足条件就报错,且返回结果是一个对象
- models.User.objects.filter(条件) ------->不满足条件不报错,但是返回结果是一个对象列表
- models.User.objects.filter().first() ------->返回一个对象,拿出对象列表中的第一个对象
- models.User.objects.filter().last()
- mdoels.User.objects.exclude(条件)
详情请见:下一篇ORM之基础