数据库
ORM框架:O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思
有什么用:1.在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。
2.ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
3.省去了直接书写Sql语句的过程,能够更快,更方便的建立数据库信息
使用django进行数据库开发的步骤如下:
- 配置数据库连接信息
- 在models.py中定义模型类
- 迁移
- 通过类和对象完成数据增删改查操作
配置
1.使用MySQL数据库首先需要安装驱动程序。
pip install PyMySQL
2.在Django的工程同名子目录的__init__.py文件中添加如下语句
from pymysql import install_as_MySQLdbinstall_as_MySQLdb() 作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。
3.修改DATABASES配置信息,在setting中的
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;
定义模型类
1.创建子应用
python manage.py startapp 应用名
2.在创建的子应用model文件中添加数据库信息
注意点:
1) 数据库表名
模型类如果未指明表名,Django默认以 小写app应用名_小写模型类名 为数据库表名。
可通过db_table 指明数据库表名。
2) 关于主键
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
3) 属性命名限制
- 不能是python的保留关键字。
- 不允许使用连续的下划线,这是由django的查询方式决定的。
- 定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)
6) 外键
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
- CASCADE 级联,删除主表数据时连通一起删除外键表中数据
- PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
- SET() 设置为特定值或者调用特定方法
2 迁移
1)生成迁移文件 python manage.py makemigrations
2)同步到数据库中 python manage.py migrate
shell工具
Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。
在django虚拟环境下运行
python manage.py shell
查看MySQL数据库日志
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
将68,69行注释取消
使用如下命令打开mysql日志文件。
tail -f /var/log/mysql/mysql.log # 可以实时查看数据库的日志内容# 如提示需要sudo权限,执行# sudo tail -f /var/log/mysql/mysql.log
数据库操作—增、删、改、查
1 增加
1)save,在shell工具下:
book = BookInfo( btitle='西游记', bput_date=date(1988,1,1), bread=10, bcomment=10)
book.save()
2)create 通过 objects.create()
HeroInfo.objects.create( hname='沙悟净', hgender=0, hbook=book
2 查询
2.1 基本查询
get 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。
2.2 过滤查询
实现SQL中的where功能,包括
- filter 过滤出多个结果
- exclude 排除掉符合条件剩下的结果
- get 过滤单一结果
2)模糊查询
contains:是否包含 BookInfo.objects.filter(btitle__contains='传')
startswith、endswith:以指定值开头或结尾。
BookInfo.objects.filter(btitle__endswith='部')
3)比较查询
- gt 大于 (greater then)
- gte 大于等于 (greater then equal)
- lt 小于 (less then)
- lte 小于等于 (less then equal)
4)日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
BookInfo.objects.filter(bpub_date__year=1980)
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
F对象: 两个属性之间的比较
from django.db.models import BookInfo.objects.filter(bread__gte=F('bcomment'))
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)在后面加计算符运算
Q对象:多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
and的用法:
BookInfo.objects.filter(bread__gt=20,id__lt=3)或BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
or的用法:
from django.db.models import QBookInfo.objects.filter(Q(bread__gt=20))
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q对象前可以使用~操作符,表示非not
BookInfo.objects.filter(~Q(pk=3))
聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和,被定义在django.db.models中。
from django.db.models import SumBookInfo.objects.aggregate(Sum('bread'))
使用count时一般不使用aggregate()过滤器。
BookInfo.objects.count()
排序
BookInfo.objects.all().order_by('bread') # 升序BookInfo.objects.all().order_by('-bread') # 降序
关联查询
由一到多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set 例:
b = BookInfo.objects.get(id=1)b.heroinfo_set.all()
由多到一的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名 例:
h = HeroInfo.objects.get(id=1)h.hbook
关联过滤查询:关联模型类名小写__属性名__条件运算符=值
BookInfo.objects.filter(heroinfo__hname='孙悟空')
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
由一模型类条件查询多模型类数据:
一模型类关联属性名__一模型类属性名__条件运算符=值
3 修改
1)save
修改模型类对象的属性,然后执行save()方法
hero = HeroInfo.objects.get(hname='猪八戒')hero.hname = '猪悟能'hero.save()
2)update
使用模型类.objects.filter().update(),会返回受影响的行数
HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
4 删除
1)模型类对象delete
hero = HeroInfo.objects.get(id=13)
hero.delete()
2)模型类.objects.filter().delete()
HeroInfo.objects.filter(id=14).delete()
重点理解运用第二种方法
查询集 QuerySet
是什么:查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
如何使用:
对查询集可以再次调用过滤器进行过滤,如
BookInfo.objects.filter(bread__gt=30).order_by('bpub_date')
有何作用:
两大特性:
1.惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集qs
qs = BookInfo.objects.all()
继续执行遍历迭代操作后,才真正的进行了数据库的查询
for book in qs: print(book.btitle)
在命令行执行时要注意缩进,代码在执行的过程中当有变量时只会在本地存储,当执行具体的操作时在数据库运行
2.缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
示例:获取第1、2项,运行查看。
qs = BookInfo.objects.all()[0:2]
管理器:
是什么:管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。
我们在通过模型类的objects属性提供的方法操作数据库时,即是在使用一个管理器对象objects。当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,它是models.Manager类的对象。
自定义管理器
注意:一旦为模型类指明自定义的过滤器后,Django不再生成默认管理对象objects,会根据你定义的管理器来执行操作
自定义管理器类主要用于两种情况:
1. 修改原始查询集,重写all()方法
在自己定义的表单模板中添加
a)打开booktest/models.py文件,定义类BookInfoManager
#图书管理器
class BookInfoManager(models.Manager):
def all(self):
#默认查询未删除的图书信息
#调用父类的成员语法为:super().方法名
return super().filter(is_delete=False)
在对应的类里调用类管理器
b)在模型类BookInfo中定义管理器
class BookInfo(models.Model): ... books = BookInfoManager()
c)使用方法
BookInfo.books.all()
2. 在管理器类中补充定义新的方法
a)打开booktest/models.py文件,定义方法create。
class BookInfoManager(models.Manager): #创建模型类,接收参数为属性赋值 def create_book(self, title, pub_date): #创建模型类对象self.model可以获得模型类 book = self.model() book.btitle = title book.bpub_date = pub_date book.bread=0 book.bcommet=0 book.is_delete = False # 将数据插入进数据表 book.save() return book
b)为模型类BookInfo定义管理器books语法如下
class BookInfo(models.Model): books = BookInfoManager()
c)调用语法如下:
book=BookInfo.books.create_book("abc",date(1980,1,1))
注意点:当数据库的字段定义错误时
1.先在models模板中将字段修改过来
2 执行数据库迁移
python manage.pymakemigrations
python manage.py migrate
3 在数据库中将字段修改并提交