title: Django-数据库操作
copyright: true
top: 0
date: 2019-07-04 20:15:35
tags:
categories: WEB 后端框架
permalink:
password:
keywords:
description: Django的数据库配置,生成数据库,数据的增删改查的API使用方法。
你是这个发疯的世界上,唯一一个不疯的人,大家才会觉得你疯了。
使用不同的数据库
Django原生支持sqlite3,所以一开始小项目使用sqlite数据库差不多够用了,并且很方便。
当然你也可以使用不同的数据库,比如mysql,oracle,如果你想使用其他的数据库,请先安装相应的数据库操作模块,并将settings文件中DATABASES位置的’default’的键值进行相应的修改,用于连接你的数据库。
在 settings.py文件中,设置DATABASES的值来选择使用不同的数据库,比如使用mysql
在settings.py文件中:
import pymysql # 一定要添加这两行!通过pip install pymysql!
pymysql.install_as_MySQLdb()
# 修改DATABASES的值
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'HOST': '192.168.1.1',
'USER': 'root',
'PASSWORD': 'pwd',
'PORT': '3306',
}
}
这里需要注意的是,Django和 Flask中一样,并不会帮你创建数据库,只会创建数据库的字段,需要你手动创建数据库
mysql中创建数据库
CREATE DATABASE database_name;
顺手在settings.py文件中把时区修改一下:
TIME_ZONE = Asia/Shanghai
创建数据库
和SQLalchemy一样,直接在你的应用的models.py文件中可以编写创建了
from django.db import models
class UserInfo(models.Model):
uid = models.AutoField(primary_key=True)
# 自增长ID,必须带参数为primary_key=True,并且是唯一主键
user = models.CharField(max_length=10)
# 字符串类型,最大长度为10
age = models.IntegerField(default=1)
# 数字类型,默认为1
sex = models.BooleanField()
# BOOL类型
email = models.EmailField()
# 自带检查 Email 合法性的 CharField
Intor = models.TextField()
# 长文本类型
Blog = models.URLField()
# 自带检查 URL 合法性的 CharField
# -------------------文件上传-----------------
upload = models.FileField(upload_to='uploads/')
# 文件上传到 MEDIA_ROOT/uploads
# 这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.
upload_s = models.FileField(upload_to='uploads/%Y/%m/%d/')
# 文件上传到 MEDIA_ROOT/uploads/2019/07/04
upload_e = models.FilePathField(path="/home/images", match="foo.*", recursive=True)
# 这个字段的值被限制在系统上某个目录中的所有文件名集合中。有三个参数
# path = '': 该参数必需。上行所说的‘某个目录’的绝对路径。Example: "/home/images".
# match = 'pattern': 可选参数。格式是正则表达式。用来拣选符合匹配正则表达式的文件
# recursive = True / False: 可选参数,默认为False。设定是否递归该目录下所有子目录的所有文件
add_date = models.DateTimeField(auto_now_add=True)
# 设置初次创建的时间
update_date = models.DateTimeField(auto_now=True)
# 设置最后修改的时间
设置索引
唯一索引,设置括号内参数unqiue=Ture
普通索引,设置括号内参数db_index=Ture
主键索引,设置括号内参数primary_key=Ture
写好数据库的结构后,就可以开始创建了,注意你需要在更目录的settings.py的 INSTALLED_APPS 变量中把你的应用名字加载保存进去。
接下来就可以创建生成数据库迁移文件了,使用命令:
python3 .\manage.py makemigrations
这个时候会发现你的应用下的文件夹 migrations 下面生成了一个文件 0001_initial.py
迁移文件:Django会数据库模型文件修改的检测,如果发生修改,那么把修改的地方完成一次迁移,相当于方便阅读的备份。
然后把迁移文件同步到数据库结构呢?使用命令
python3 manage.py migrate
这样就会把写完的数据库模型同步到数据库。
那么如何看到数据库同步的过程中发生了什么呢?
使用命令:
python3 manage.py sqlmigrate show 0001
# 这里的show是我创建的功能应用的名字,0001代表生成的第一个迁移文件
通过这样就能直接看到数据库执行了什么语句
总结一下,创建数据库一共需要三步:
- 修改models.py中模型
- 运行python3 manage.py makemigrations为改动创建迁移记录
- 运行python3 manage.py migrate,将操作同步到数据库。
数据并发
在高并发情况下,mysql数据库会出现报错:
'MySQL server has gone away'
原因是django每次都会发起新的连接,线程池处理任务时,正常使用的连接中不会被关闭,但由于数据库端有最长连接时间的限制(默认为8小时),在超时后会发生InterfaceError: (0, ‘’)(连接关闭后使用连接/游标)或Error(2006, ‘MySQL server has gone away’)(mysql 服务器主动关闭连接)这类错误,所以一般会在每个任务线程中调用django.db.connection.close()进行关闭操作。
解决方法如下:
from django.db import connections
def close_old_connections():
for conn in connections.all():
conn.close_if_unusable_or_obsolete()
每次在需要数据库操作的时候,都先执行 close_old_connections() 这个函数杀死空闲连接
数据操作
数据的操作增删改查可以说是SQL的灵魂核心,掌握熟练的SQL语句也是非常重要的,Django为了让我们少背一写SQL语句,很贴心的提供ORM直接操作数据的增删改查,有时候怕你嫌麻烦,更是贴心的直接给你提供了一个每个应用对应的管理界面
使用后台操作
首先需要创建一个管理员用户,使用命令
python3 manage.py createsuperuser
然后输入用户名
好贴心…
然后输入账号密码直接登陆了…
登陆地址为:
http://127.0.0.1/admin
可以看到有用户组可以直接添加管理员用户,他们由django.contrib.auth模块提供的身份认证框架。。
还可以修改后台登陆地址,在根目录下的urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('LetMeLOGIN/', admin.site.urls)
]
这样登陆地址就变成了:
http://127.0.0.1/LetMeLOGIN
这TM谁能猜到你的后地址啊,66
但是吧,现在后台界面啥都没有啊,我要管理我的数据啊,这个时候需要注册一下
在你的应用的目录下的admin.py文件中,修改内容:
from django.contrib import admin
from .models import UserInfo
# 导入你创建的模型的名字
admin.site.register(UserInfo)
然后刷新管理界面,就会发现你的数据库出现了
点进去看看
哇哇哇哇要哭了,简直简直太贴心了吧!!
在页面的底部,则是一些可选项按钮:
delete:弹出一个删除确认页面
save and add another:保存当前修改,并加载一个新的空白的当前类型对象的表单。
save and continue editing:保存当前修改,并重新加载该对象的编辑页面。
save:保存修改,返回当前对象类型的列表页面。
数据增删改查
增
数据的添加方法:
data.objects.create(User='陈二狗')
或者稍微复杂一点
datas = data()
datas.User = '陈二狗'
datas.save()
如果是外键的话,比如这样
class A:
user = models.CharField(max_length=5)
area = models.ForeignKey('B',on_delete=models.DO_NOTHING)
class B:
area = models.CharField(max_length=10)
要添加数据的话
b = B()
b.area='上海'
b.save()
a = A()
a.user='浪子'
a.area = b
a.save()
查
常规的有5种方法获取数据
第一种是 data.objects.all()
这种方法获取的是这张表里面的所有数据
第二种是 data.objects.get(id=1)
这种方法必须确保获取的结果只有一个,不然会报错,获取的条件是id=1
第三种方法是 data.objects.filter(id=2)
这种方法是筛选出id=2的数据,括号内还能有多个条件,比如(id=2,gender=‘boy’)
第四种方法是 data.objects.exclude(id=2)
这种方法是获取到id不等于2的数据
第五种方法是 data.objects.order_by(name)
这种方法获取到的结果是按照name进行排序后的结果
第六种方法是 data.objects.first(name=‘小桃红’)
这种方法获取到的结果是符合条件的第一个对象,当然还有最后一个对象,使用的是.last(name=‘小桃红’)
按照日期获取当天数据
from django.utils import timezone
from datetime import timedelta
now = timezone.now()
start = now - timedelta(hours=23,minutes=59,se