数据库
ORM框架
可以通过类和类对象就能操作它所对应的表格中的数据,可以根据我们设计的类自动生成数据库中的表格
djang中内嵌ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作
使用django进行数据库开发步骤如下:
1.配置数据库连接信息
2.在models.py中定义模型类
3.迁移
4.通过类和对象完成数据增删改查
配置
在setting.py中保存了数据库的连接配置信息,Django默认初始化配置使用sqlite数据库
1.使用mysql数据库首先安装驱动
pip install PyMySQL
2.在djang工程同名子目录的__Innit__.py文件中添加语句
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
意思是让django的ORM能以mysqldb的方式来调用PyMySQL
3.修改DATABASES配置信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'mysql', # 数据库用户密码
'NAME': 'django_demo' # 数据库名字
}
}
4.在MySQL中创建数据库
create database django_demo default charset=utf8;
定义模型类
模型类定义在应用/models.py文件中
模型类必须继承自Model类,位于包django.db.models中
1.数据库表名
如果模型类未指明表名,django默认小写app应用名_小写模型类名 为数据库表名
2.关于主键
django会为表创建自动增长的主键,每个模型只能有一个主键,默认主键属性未id,可以用pk代替,primary key.
3.属性命名限制
属性=modelsz.字段类型(选项)
4.字段类型
AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性
BooleanField 布尔字段,值为True或False
NullBooleanField 支持Null、True、False三种值
CharField 字符串,参数max_length表示最大字符个数
TextField 大文本字段,一般超过4000个字符时使用
IntegerField 整数
DecimalField 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
FloatField 浮点数
DateField 时间
TimeField 时间
FileField 上传文件字段
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片
5.选项
null 如果为True,表示允许为空,默认值是False
blank 如果为True,则该字段允许为空白,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False
default 默认
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False
null是数据库范畴的概念,blank是表单验证范畴的
6.外键
迁移
将模型类同步到数据库中
1.生成迁移文件
python manage.py makemigrations
2.同步到数据库中
python manage.py migrate
演示工具使用
shell工具
django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等)以便可以直接再终端执行测试python语句
通过如下命令进入shell
python manage.py shell
查看mysql数据库日志
查看mysql数据库日志可以查看数据库的操作记录,mysql日志文件默认没有产生,需要配置
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
将6869行前面#去掉,之后重启mysql服务
sudo servive mysql restart
使用如下命令打开mysql日志文件
tail -f /var/log/mysql/mysql.log
可以实时查看数据库的日志内容
如提示需要sudo权限,执行
sudo tail -f /var/log/mysql/mysql.log
数据库操作
1.增加
增加数据有两种方法
1.save
通过创建模型类对象,执行对象的save()方法保存到数据库中
2.create
通过模型类.objects.create()保存
2.删除
删除有两种方法
1.模型类对象delete
hero=HeroInfo.objects.get(id=1)
hero.delete()
2.模型类.objects.filter().delete()
HeroInfo.objects.filter(id=1).delete()
3.修改
修改有两种方法
1.save
修改模型类对象的属性,然后执行save()方法
hero=HeroInfo.objects.get(hname='pig')
hero.hname='dog'
hero.save()
2.update
使用模型类.objects.filter().update(),回返回受影响的行数
HeroInfo.objects.filter(hname='pig').update(hname='dog')
4.查询
4.1.基本查询
get查询单一结果,如果不存咋会抛出模型类.DoesNotExist异常
all查询多个结果
count查询结果数量
4.2过滤查询
实现sql中的where功能
filter 过滤出多个结果
exclude 排除掉符合条件剩余的结果
get 过滤单一结果
过滤条件的表达语法如下:
属性名称__比较预算符号=值
1.相等
exact :表示判等
例:查询编号是1的图书
BookInfo.objects.filter(id__exact=1)
2.模糊查询
contains:是否包含
例:查询书名包括传的书
BookInfo.objects,filter(btitle__contains='传')
startswith endswith:以指定值开头或结尾
例:查询书名以部结尾的书
BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,再这些运算符前加上i表示不区分大小写
iexact,icontains,istartswith,iendswith
3.空查询
isnull:是否为null
例:查询书名不为空的图书
Bookinfo.objects.filter(btitle__isnull=False)
4.范围查询
in:是否包含再范围内
例:查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1,3,5])
5.比较查询
gt 大于
gte 大于等于
lt 小于
Ite 小于等于
6.日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
例:查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书
BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))
4.3F和Q对象
1.F对象
之前的查询都是对象的属性和常量值比较,两个属性怎么比较
使用F对象,被定义在django.db.models中
语法:F(属性名)
例:查询阅读量大于等于评论量的图书
from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F对象上使用算数运算
例:查询阅读量大于2倍评论量的图书
from django.db.models import F
BookInfo.objects.filter(read__gte=F('bcomment')*2)
2.Q对象
多个过滤器逐个调用表示逻辑与关系,同SQL语句中where部分的and关键字
例:查询阅读量大于20,并且编号小于3的图书
BookInfo.objects.filter(bread__gt=20,id__It=3)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被定义在django.db.models中
语法:
Q(属性名__运算符=值)
例:查询阅读量大于20的图书,改写为Q对象如下
from django.db.models import Q
BookInfo.objects.filter(Q(bread__gt=20))
Q对象可以使用& | 连接
例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
from django.db.models import Q
BookInfo.objects.filter(Q(bread__gt=20)|Q(pk__It=3))
Q对象前可以使用~操作符,表示非not
例:查询编号不等于3的图书
BookInfo.objects.filter(~Q(pk=3)
5.聚合函数
1.聚合函数
使用aggregate()过滤器调用聚合函数,聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和,被定义在django.db.models中
例:查询图书的总阅读量
from django.db.models import Sum
BookInfo.objects.aggregate(Sum('bread'))
注意:使用aggregate的返回值是一个字典类型,格式如下:
{‘属性名_聚合类小写’:值}
如:{‘bread__sum’:3}
使用count时,不适用aggregate()过滤器
例:查询图书总数
BookInfo.objects.count()
注意:count函数的返回值是一个数字
2.排序
使用order_by对结果进行排序
BookInfo.objects.all().order_by('bread')升序
BookInfo.objects.all().order_by('-bread')降序
6.关联查询
由一对多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set.all()
一对象.小写多表名__set.all()
例:
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()
由多到一的访问语句:
多对应的模型类对象.多对用的模型类中的关系类属性名
多对象.外键
例:
h=heroinfo.objects.get(id=1)
h.hbook
访问一对应的模型类关联对象的id语法:
多对应的模型类对象.关联类属性_id
例:
h=HeroInfo.objects.get(id=1)
h.hbook_id
2.关联过滤查询
由多模型类条件查询一模型类数据:
格式:
多模型类名小写_属性名_条件运算符=值
例:查询图书,要求图书英雄为"孙悟空"
BookInfo.objects.filter(heroinfo_hname='孙悟空')
例:查询图书,要求图书中英雄的描述包含"八"
BookInfo.objects.filter(heroinfo_hname_contains='八'
根据由一模型条件查询多模型的数据
格式:
模型类关联属性名_模型类属性名_条件运算符=值
多.objects.filter(外键__一的字段=‘字段名’)
例:查询书名为“天龙八部”的所有英雄
HeroInfo.objects.filter(hbook__btitle='天龙八部')
查询图书阅读量大于30的所有英雄
HeroInfo.objects.filter(hbook__bread__gt=30)
查询集QuerySet
all()返回所有
filter()条件查询
exclude()取反
order_by()排序
对查询集可以多次使用过滤器过滤
如:
BookInfo.objects.filter(bread__gt=30).order_by('bpub_date')
判断是否有数据:exists() 有则True,无则False.
2.两大特性
1).惰性执行
创建查询及不访问,调用数据才访问,迭代,序列化与if合用
2).缓存
使用同一个查询集,第一次用时查,然后django把结果缓存,再用时用缓存数据,减少了查询次数
3.限制查询集合
对查询集切片后返回新集不立即查询
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常
例:获取第1、2项,运行查看
区间左闭右开
qs=BookInfo.objects.all()[0:2]