Django-数据库操作

本文详细介绍了Django中如何进行数据库操作,包括数据库配置、数据的增删改查、并发处理、数据操作API的使用,以及如何创建、管理数据库。内容涵盖了Django的ORM操作,如使用不同数据库、数据并发控制、数据操作方法、后台管理及数据的查询、修改、删除。文章还提到了数据过滤、外键和多对多关系处理、缓存机制以及如何执行原生SQL语句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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代表生成的第一个迁移文件

通过这样就能直接看到数据库执行了什么语句

总结一下,创建数据库一共需要三步:

  1. 修改models.py中模型
  2. 运行python3 manage.py makemigrations为改动创建迁移记录
  3. 运行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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子燕青啦啦啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值