1、链接数据库
mysql,sqlserver,oracle...
django默认只能链接关系型数据库
1、安装依赖的库
可以使用的库:1、pymysql
2、python_mysql(不稳定)
3、mysqlclient(配置麻烦)
安装pymysql:pip install pymysql
如果出现timeout超时可以使用其他的资源下载:pip install 模块名 -i http://pypi.douban.com/simple
2、导入库
在__init__文件中编写:
# 导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()
3、在setting的database中配置mysql的连接
'ENGINE':'django.db.backends.mysql', 设置驱动
'NAME':'week01', 设置数据库名
'USER':'root', 设置用户名
'PASSWORD':'dxx1123', 设置密码
'HOST':'localhost', 设置主机地址
'PORT':3306, 设置端口号
4、注意:不要忘记了在数据库中创建该库
create database 数据库名 charset='utf8'
5、连接mysql数据库
点击左侧database--- + ---data source ---数据库类型(如:mysql)--- 设置 账户 密码 主机(注意:如果对mysql设置远程连接,需要使用远程连接的账号密码)
6、测试程序是否能连接
1、执行迁移
python manage.py makemigrations
python manage.py migrate
2、看到自动生成的表即可
2、orm 对象关系隐射–思想:相当于一个翻译机
object relational mapping
1、开发人员不需要写复杂的sql语句,直接调用对应的方法即可
2、开发人员不需要封装查询结果,查询结果直接就是对象,可以直接使用
3、如果开发人员需要更换数据库,不需要更改任何代码,直接修改数据库的连接即可
3、创建一个表
1、需要在model模块中创建一个类
注意该类必需继承models.Model
注意:表名默认是 应用名_类名
2、定义属性名—属性需要与表中字段对应
字段名即属性名
字段的数据类型
字段的约束类型
3、案例:
# 定义模型
# 注意:执行迁移后,才会在数据库自动创建对应的表
# 默认的表名为:应用名_类名 类名会自动转换成全小写
# 默认会自动创建主键id,如果使用AutoField则不会自动创建
class Person(models.Model):
p_name = models.CharField(max_length = 20,null=False,unique=True)
p_age = models.IntegerField(default = 10)
p_sex = models.BooleanField(default = True)
表的结构是可以修改的,修改后,需要重新迁移才能生效,最好不要修改
修改表名:
可以使用(内部类):
class Meta:
db_table = '表名'
修改属性名:
默认的字段名就是定义的属性名
可以使用 db_column = '字段名'
4、增加一个数据
1、创建一个对象
2、设置属性
3、保存数据 对象名.save()
5、删除数据
mysql语句:delete from 表名 where 条件
1、要删除数据,前提条件是先查询到对应的数据
2、删除:
可以直接删除多个结果,也可以直接删除一个
查询结果.delete()
6、修改数据
mysql语句:update 表名 set 字段名=数据.. where 条件
1、要修改数据,前提条件也是先查询到对应的数据
2、修改:
对象名.属性名 = 值
对象名.save()
7、查询数据
1、查询方法
格式:类名.objects.方法 ---支持链式调用
1、有多条结果的
all() 获取所有的结果
filter(条件) 按照条件筛选数据
exclude(条件) 筛选出满足条件以外的数据
2、单个结果的
first() 获取结果集的第一个
last() 获取结果集的最后一个
get() 获取一个结果
注意:有且只有一个结果的时候使用get()才可以,如果结果超过一个或没有,程序都会出错
3、其他
count() 获取结果集的数量
order_by("-属性名") 表示按照属性名对应的值排序,默认是升序,-属性名表示降序排序
如果是字符类型的数据,是按照字符对应的ACSII码来排序的,一个字符一个字符的比较,如:'aac' 'abc' ,'aac'小
exists() 判断查询结果集中是否有数据
values() 获取结果集的数据,该数据是类似字典的形式,方便操作
2、条件中的运算符
格式:属性名__运算符 = 值 (两个下划线)
运算符:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
= 等于 exact
不等于 exclude(条件)
isNull 是空的数据
startwith 查询以某个字符开始
endwith 查询以某个字符结果
contain 查询包含某个字符
i 是ignore的简写,忽略大小写
istartwith 查询以某个字符开始
iendwith 查询以某个字符结果
icontain 查询包含某个字符
in 成员运算符,是否是集合中值的其中一个,满足一个就符号条件
特殊用法** pk = 值 pk是主键的简写
3、Q与F对象
1、Q对象,用来帮助实现 逻辑运算符
需要倒包
& 且 如:...filter(Q(p_age__gt=90)&Q(p_age__lt=95))
| 或 如:...filter(Q(p_name='小明')|Q(p_name='小强'))
~ 非 如:...filter(~Q(p_age__lte=100))
2、F对象,用来帮助自己属性与自己的属性比较
如:需求:实现年龄比id小的数据
persons=Person.objects.filter(p_age__lt=F('id'))
4、查询结果的切片
格式:结果集[start:stop] 左闭右开
截取从start位置到stop位置的数据
5、聚合函数的使用
注意:1、大小写 2、倒包
Max 最大值
Min 最小值
Avg 平均值
Sum 总和
如:求年龄最大的/最小的
res=Person.objects.all().aggregate(Max('p_age'))
res=Person.objects.all().aggregate(Min('p_age'))