当涉及大数据存储及读取时,我们会使用数据库。在django里面,常用及默认的数据库是sqlite,也可在配置中更改为其他数据库。
通常,为了使用数据库,需要建立Model模型,每个Model模型对应数据库中唯一的一张表,模型的每个属性都表示为数据库中的一个字段,这个不随数据库的变更而改变(表结构一致,只需要修改API),从而减少了修改工作。
目录
1.安装数据库
(1)在电脑上安装数据库
mysql:
(要记住你设置的用户名及密码)
网址:下载
下载完成后开始安装:
(2)在当前python环境中安装 pymysql
pip install pymysql
2.连接数据库(sqlite)
(pycharm是专业版才可,学习中电脑mysql账号密码都对但是pycharm连接不上,网上找了很多资料暂未找到原因,为了接下来的学习,转用sqlite继续学习)
新建数据库
双击数据库,则出现右侧数据库,这里也可直接在此连接
如果你的数据库无法显示结构,可能是没有连接或缺失插件。在下图2的位置一般可弹出提示,点击安装即可,然后点击3测试成功后,刷新数据库即可。
3.数据库配置
常用有:
django.db.backends.postgresql
django.db.backends.mysql
django.db.backends.sqlite3
django.db.backends.oracle
按步骤2操作后,可以看到在setting文件中已更改:
mysql为如下格式:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mytest1',#数据库的名
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
}
}
4.创建模型
找到应用程序目录下的Models文件,我们在此文件中定义表结构。
常用字段:
字段 | 说明 |
---|---|
AutoField | 自动创建一个自增的 列 ,如果要显式的自定义一个自增列,必须设置primary_key=True。 要注意.一个model类不能有两个自增的AutoField |
CharField | 字符串字段 ,必须设置max_length参数 ,如果超过254个字符,建议使用TextField |
BooleanField | 布尔类型,不可为空(NullBooleanField为允许未空的布尔类型) |
DateField | 日期类型 (date),自动设置该字段为现在日期用DateField.auto_now,第一次被创建时自动设置该字段为现在日期用DateField.auto_now_add |
DateTimeField | 日期(datetime ),同DateField的参数 |
FloatField | 浮点数 |
IntegerField | 整型 |
EmailField | 带有检查 Email 合法性的 CharField |
TextField | 大文本。默认对应的form标签是textarea |
除上面的表格内容,还有很多字段,可自行按需搜索
5.数据库迁移
通过迁移命令执行迁移后,会根据model.py文件定义的类字段生成对应的sql语句脚本,进行相应的数据库操作。
代码如下:
# 生成迁移文件 全部迁移不写模块名
python manage.py makemigrations [模块名]
#执行迁移 全部迁移不写模块名
python manage.py migrate [模块名]
此时刷新数据库:
6.操作模型控制数据库的增删改查
导入模型:
from myapp.models import PeopleInfo
查:
【模型类名】.objects.【方法】(【条件】)
常见方法有如下:
方法 | 说明 |
---|---|
get() | 返回满足条件的单条数据(多条或者0条会报错) |
count() | 返回查询集中的数据个数 |
first() | 取第一个值 |
last() | 取最后一个值 |
exists() | 判断是否存在 |
all() | 返回所有数据 |
filter(条件) | 返回符合条件的数据 |
exclude(条件) | 返回不符合条件的数据 |
values() | 返回字典列表 |
order_by() | 排序查询. 默认为升序排列,降序可在字段前加一个负号 |
例如: PeopleInfo.objects.get(name=‘yy’)为返回name为yy的对象
常用条件:
条件 | 说明 |
---|---|
exact | 相等 |
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
isnull | 为空查询 |
contains | 包含 |
startswith | 以什么开头 |
endswith | 以什么结尾 |
in | 在什么范围 |
例如:PeopleInfo.objects.get(name__exact=“yy”)为返回name为yy的对象
例如:PeopleInfo.objects.get(name__endswith=‘t’)
例如:PeopleInfo.objects.filter(name__in= [“name1”,“name2”]
增:
#第一种方式
user=PeopleInfo.objects.create(name='uu',age=11,sex=1,)
user.save()
#第二种方式
user2=PeopleInfo(name='yy',age=23,sex=0)
user2.save()
删:
# 第一种方式
user = PeopleInfo.objects.create(name='uu', age=11, sex=1, )
user.delete()
# 第二种方式
PeopleInfo.objects.filter(id=2).delete()
改:
# 第一种方式
user = PeopleInfo.objects.create(name='uu', age=11, sex=1, )
user.age=3
user.save()
# 第二种方式
PeopleInfo.objects.filter(id=2).update(age=2)
7.其他查询方式
F对象:
常用于同行数据字段间的互相比较
例如:
from django.db.models import F
PeopleInfo.objects.filter(name=F('age'))
Q对象:
常用于字段间的逻辑比较
from django.db.models import Q
PeopleInfo.objects.filter(id=6).filter(age=10)
PeopleInfo.objects.filter(Q(id=6)|Q(age=10))
PeopleInfo.objects.filter(~Q(id=6))