对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
Python中的类 ---> 表
Python里面的类属性 ---> 字段
python 里面的类对象 ---> 数据库表里的1条数据
我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。
ORM的出现充当了对象和数据库层次的桥梁作用。
优点:
提高我们的开发效率
开发人员技术参差不齐,大神写的sql优化非常好
缺点:
查询效率受影响 关系数据库技能退化
Django步骤
要想一个页面展示在用户面前
1.打开浏览器,输入网址,发起请求
2,接受请求 ,响应内容
-url要配置---> 将来 浏览器,输入的路径
url(r'^index/')
https://127.0.0.1:8000/index
-视图要写---> 用户输入 网址之后调用的内容
def index(request):
return render(request,'index.html')
def + 视图函数的函数名称 第一个参数 是request
render 返回一个模板 (request,html)
3. 模型 models.py 这个模块 mvt
django给我们提供了一个orm框架
因为有了这个框架 我们可以不需要去写各种 sql语句
orm 类---> 表 属性对应--->字段 实例对象--->1行数据
属性类型
当前选择的数据库支持字段的类型
渲染管理表单时使用的默认html控件
在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
字段类型
AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。(必须填入参数primary_key=True)
BooleanField:布尔字段,值为True或False。
NullBooleanField:支持Null、True、False三种值。
CharField(max_length=字符长度):字符串。
映射到数据库会是varchar
参数max_length表示最大字符个数。
TextField:大文本字段,一般超过4000个字符时使用。
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):十进制浮点数。
参数max_digits表示总位数。
参数decimal_places表示小数位数。
FloatField:浮点数。
DateField[auto_now=False, auto_now_add=False]):日期。
参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。
参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
TimeField:时间,参数同DateField。
DateTimeField:日期时间,参数同DateField。
FileField:上传文件字段。
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。
选项 约束
null:如果为True,表示允许为空,默认值是False。
blank:如果为True,则该字段允许为空白,默认值是False。
对比:null是数据库范畴的概念,blank是表单验证范畴的。
db_column:字段的名称,如果未指定,则使用属性的名称。
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
default:默认值。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
4. 不用sqllite 我们使用mysql
如何去配置我们的mysql
4.1 settings.py DATABASE
DATABASES = { 'default': { 'ENGINE':'django.db.backends.mysql',# 数据库类型
'NAME': 'test1',# 数据库的名称,django不会直接给我们创建数据库需要我们手动创建
'USER': 'root',#数据库用户
'PASSWORD': '123456',# 数据库密码
'HOST': '127.0.0.1', 'PORT': '3306',# 端口号 } }
4.2 我们需要安装一个 python连接mysql的驱动 pymysql
4.3 我们需要把这个驱动 添加到项目里面来
项目下的__init__文件里:
import pymysql
pymysql.install_as_MySQLdb()
5. 设计完python的类(表) 不意味着 数据库里面就有这张表
5.1 生成迁移文件
python manage.py makemigrations
5.2 执行迁移
python manage.py migrate
同步到数据库,创表成功,可以插入数据
6. 查询
6.1 查询 id=1 的书 = excat
list = BookInfo.objects.filetr(id=1)
list = BookInfo.objects.filetr(id__exact=1)
mysql日志:
配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
然后执行
sudo service mysql restart
使用如下命令打开mysql日志文件。
sudo tail -f /var/log/mysql/mysql.log
条件查询
1.判等 ------> exact
2.模糊查询 -----> contains
查询以指定值开头 -----> startswith
查询以指定值结尾 ------> endswith
3.空值查询 ----> isnull (是否为null)
4.范围查询 ------> in (是否包含在范围内)
5.比较查询 -----> gt、gte、lt、lte:大于、大于等于、小于、小于等于。
6.日期查询 ---- >year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
F对象和Q对象
查询两个属性的比较会使用F对象。
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。
aggregate的返回值是一个字典类型
使用count时一般不使用aggregate()过滤器。
注意count函数的返回值是一个数字。
查询集
返回查询集的过滤器如下:
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
order_by():对结果进行排序。
返回单个值的过滤器如下:
get():返回单个满足条件的对象
count():返回当前查询结果的总条数。
aggregate():聚合,返回一个字典。
判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
查询集两大特性
惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。
限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。