一、ORM简介
1.1 需求
- python、php、Java是开发语言;mysql、sql server是数据库语言;两种语言需要实现互操作。
- ORM是Object-Relational Mapping,对象关系映射。用于实现数据库语言和编程语言之间的映射。
1.2 映射关系
- 对象关系映射
python | 类型 | sql |
---|---|---|
get | 查询 | SELECT |
filter | 查询 | SELECT |
all | 查询 | SELECT |
exclude | 查询 | SELECT |
save | 增加 | UPDATE |
create | 增加 | INSERT |
delete | 删除 | DELETE |
- 其他映射技术
数据类型映射表中的属性
类映射数据库表表 - 缓存优化
ORM会直接从数据库中拿到表并直接以类的形式保存,而不是每次查询时才执行数据库的select操作。所以需要ORM中需要save。 - ORM技术
Django ORM:创建Model类和定义Field字段来实现。
SQLAlchemy(目前的通用标准)、Peewee、Storm
二、model语法
2.1 创建语法
2.1.1 案例
from django.db import models #导入django的models模块
'''
创建模型类并继承models.Model。在数据库中对应生成一张表cms_frienddb,并且具备如下字段
'''
class friendDB(models.Model):
#friendId = models.AutoField(verbose_name="id",primary_key=True)
#用python建表会自动创建自增的id字段
friendName = models.CharField(verbose_name="朋友名称",max_length=50)
friendAge = models.IntegerField(verbose_name="朋友岁数")
friendInf = models.TextField(verbose_name="朋友介绍")
friendMail = models.EmailField(verbose_name="朋友邮箱")
friendImg = models.ImageField(verbose_name="朋友头像")
sexchoice=(
("male","男"),
("female","女"),
)
friendSex = models.CharField(verbose_name="性别",choices=sexchoice,default="male",max_length=50)
#定义Meta子类,为模型类添加其他说明,例如数据库表名,默认排序方式,数据库模型
class Meta:
verbose_name="朋友表"
verbose_name_plural="朋友们"
#在django提供的admin模块中,为该表中的每一个对象指定一个属性作为标签显示
def __unicode__(self):
return self.friendName
2.1.2 案例的说明
- 建了数据库的类之后需要
python manage.py makemigrations
和migrate
,需要进行数据迁移(数据同步)。若数据库中没有已定义的表则会直接创建,并且为每个边生成一个自增的id字段作为唯一的标识。 - 所有Django模型类都继承django.db.models;所以需要在models这个模块里面
from django.db import models
。 - 每个models中类对应数据库中的一张表。表的名称是:appname+modelname
- 每个类中的filed属性对应数据表中的数据项。
- Meta子类用于定义一些数据库表的元数据,例如数据库表名、默认排序方式、数据库模型。
2.1.3 Field类型
- AutoField:一个自动递增的字段,当向数据库中添加记录时它会自动增长,通常用作该表的记录的主键。需要注意的是,通过django数据迁移所产生的表,会自动生成一个AutoField类型的’id’属性,这时候我们是无法自行添加其他AutoField类型的属性的。mysql限制每个表只能有一个AutoField类型的属性。
- CharField:字符串字段,用于输入较短的字符串,必须指定
max_length
,对应html中的<input type="text">
。 - TextField:文本字段,用于输入较多的字符串,对应html中的
<input type="textarea">
; - EmailField:邮箱字段,前端部分最好使用正则表达式检查。
- DateTimeField:日期字段,通常传入时间戳。
- ImageField:用于上传图片,需要有
upload_to
参数,使用本字段需要安装python pillow等图片库。 - IntegerField:整数字段。
2.1.4 Field属性
- primary_key:
True
orFalse
,是否为主键 - default:默认值
- null:
True
orFalse
,是否允许某字段为空。默认是False
(不允许为空)。 - blank:
True
orFalse
, 是否允许用户不输入,默认为False
(用户不可以不输入这个字段)。 - choices:该字段的值是一个二维的元组,是(‘数据库实际存储的值’,‘HTML页面显示的值’)。
- max_length:最大长度,可以为CharField、TextField、EmailField设置,其中CharField必须设置该Field属性。
- verbose_name:设置字段的后台显示名称(不是表的属性名称)
- upload_to:设置上传路径,
ImageField
和FileField
这两种字段都需要设置。
2.1.5 Meta类属性
- verbose_name:设置数据库内每一个对象(每一个元组)的名称。默认值为类名的小写形式。
- verbose_name_plural:对象名的复数形式,显示在admin页面上。
- db_table:设置映射的数据表明;proxy:设置本模型以及继承该模型的子模型是否为代理模型;abstract:设置本模型类是否为抽象基类。
三、数据迁移
- 在models中对数据库的类进行了修改。
- 打开manage.py Task或者直接在console窗口用
python mannage.py
来执行后面的命令。 - 执行
makemigrations
,Model会被扫描同时与migrations文件夹中的之前的版本进行比较,生成本次的迁移文件。 - 执行
migrate
。 - 可以通过
makemigrations appname
和migrate appname
来进行特定app的数据迁移。
四、python操作数据库
4.1 常用的两种数据库
- mysql:也就是现在常用的Mariadb。
- sqlite :轻量级、可嵌入、但不能承受高并发,适合桌面和移动应用。
4.2 安装数据库驱动(以mysql为例)
- 在服务端成功安装数据库之后,需要为python安装mysql的驱动来连接和操作数据库。主要是这两种:
mysql-connect-python
和MySQL-python
。随意选择一个装,前者是mysql官方的纯python驱动,而后者是封装了c驱动的python驱动。 - 需要注意的是,python的DB-API定义都是通用的,所以使用sqlite和mysql时,python下操作数据库的语法是类似的。
4.3 python中数据库的查询方法
python | 类型 | sql |
---|---|---|
get | 查询 | SELECT |
filter | 查询 | SELECT |
all | 查询 | SELECT |
exclude | 查询 | SELECT |
ModelName.Objects.all()
:查询模型类(某张表)的所有数据。
ModelName.Objects.get()
:返回符合筛选条件的单个对象。
ModelName.Objects.filter()
:返回符合筛选条件的单个或多个对象。
ModelName.Objects.exclude()
:返回不符合筛选条件的数据集。
注意:上面的ModelName是在models.py中为数据库表定义的类名。
案例:
all_user = usertb.objects.all()
#查询模型类的所有数据
best_user = usertb.objects.get(id=int(user_id))#
#获取模型类的某一个对象(获取表的某一个元组)
user_course = sctb.objects.filter(id=int(user_id))
#获取模型类的多个对象(获取表的多个元组)
4.4 python中数据库的增加方法
python | 类型 | sql |
---|---|---|
save | 增加 | UPDATE |
create | 增加 | INSERT |
ModelName.Objects.create()
:为某个模型类增加一个对象。(为数据表增加一个元组)
ModelName.Objects.save()
:保存操作。
案例:
user_cms=UserCMS()
#做增加操作之前需要先实例化
user_cms.username="user"
user_cms.password="pass"
user_cms.save()
或者
user_cms=UserCMS.objects.create(username="user",password="pass")
comment.save()
4.5 python中数据库的增加方法
python | 类型 | sql |
---|---|---|
delete | 删除 | DELETE |
ModelName.Objects.all().delete()
:s删除模型类(某张表)的所有数据。
ModelName.Objects.get().delete()
:删除符合筛选条件的单个对象。
ModelName.Objects.filter().delete()
:删除符合筛选条件的单个或多个对象。
ModelName.Objects.exclude().delete()
:删除不符合筛选条件的数据集。
deluser = UserCMS.objects.filter(username=username,password=password)
deluser.delete()
或者
UserCMS.obejects.filter(username=username,password=password).delete()
4.6 python中数据库表的排序方法
ModelName.Objects.all().order_by('xxx')
:会返回根据某字段排序的模型类的所有数据。
例如:all_interviews = Interview.objects.all().order_by('-read_counts')
4.7 python中数据库表的切片方法
ModelName.Objects.all().order_by('xxx')[a;b]
:在排序结果上去从a到b的对象。
例如:all_interviews = Interview.objects.all().order_by('-read_counts')[:3]
4.8其他操作
关系操作:一对一操作、一对多操作、多对得多操作。
面向对象操作:抽象类继承、多表继承、代理模型继承。