【Django青铜修炼手册】django+mysql的使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

Django中每一个模型model都对应于数据库中的一张表,每个模型中的字段都对应于数据库表的列。方便的是,django可以自动生成这些create table, alter table, drop table的操作。其次Django为咱们也提供了后台管理模块(Django-Admin),主要功能是通过后台管理来实现客户端的功能,可以对数据进行增删改查。也可以通过该功能进行二次开发

上期回顾 :[Django青铜修炼手册] 初识Django

Django中的mysql配置

在上期内容,我们了解了settings.py配置信息的内容,其中DATABASES是用来管理数据库配置的,默认是sqlite3数据库,所以我们需要将其修改成mysql数据库。


# Database# https://docs.djangoproject.com/en/2.0/ref/settings/#databases# 数据库配置 默认的数据库为sqlite# DATABASES = {# 'default': {# 'ENGINE': 'django.db.backends.sqlite3',# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),# }# }
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', # 数据库引擎'NAME': 'django_mysql', # 数据库名'USER': 'root', # 账号'PASSWORD': 'root', # 密码'HOST': '127.0.0.1', # HOST'POST': 3306, # 端口
}
}
AI 代码解读

字段名称代码中都添加了相应说明,ENGINE为MYSQL数据库引擎,这个当然不会凭空出现,需要我们去安装

安装pymysql


pip3 install pymysql
AI 代码解读

项目中配置

在最开始的项目包下的__init__.py中进行如下配置


"""
setting中的配置默认为sqlite3数据库 当需要修改成MySql时
并且在setting.py的同级目录的__init__.py 加入如下配置
否则会报错: Error loading MySQLdb module.
"""import pymysql
pymysql.install_as_MySQLdb()
AI 代码解读

如果mysql配置信息错误(用户名、密码、host等)控制台会报如下异常


pymysql.err.OperationalError: (1045, "Access denied for user 'ROOT'@'localhost' (using password: YES)")
AI 代码解读

在app文件的models.py文件中 创建Student(学生信息)和StudentUnion(社团信息)

models.py:数据模块,用于数据库设计


"""
创建学生信息表模型
"""from django.db import models"""
该类是用来生成数据库的 必须要继承models.Model
"""class Student(models.Model):"""
创建如下几个表的字段
"""# 学号 primary_key=True: 该字段为主键
studentNum = models.CharField('学号', primary_key=True, max_length=15)# 姓名 字符串 最大长度20
name = models.CharField('姓名', max_length=20)# 年龄 整数 null=False, 表示该字段不能为空
age = models.IntegerField('年龄', null=False)# 性别 布尔类型 默认True: 男生 False:女生
sex = models.BooleanField('性别', default=True)# 手机 unique=True 该字段唯一
mobile = models.CharField('手机', unique=True, max_length=15)# 创建时间 auto_now_add:只有在新增的时候才会生效
createTime = models.DateTimeField(auto_now_add=True)# 修改时间 auto_now: 添加和修改都会改变时间
modifyTime = models.DateTimeField(auto_now=True)# 指定表名 不指定默认APP名字——类名(app_demo_Student)class Meta:
db_table = 'student'"""
学生社团信息表
"""class studentUnion(models.Model):# 自增主键, 这里不能设置default属性,负责执行save的时候就不会新增而是修改元素
id = models.IntegerField(primary_key=True)# 社团名称
unionName = models.CharField('社团名称', max_length=20)# 社团人数
unionNum = models.IntegerField('人数', default=0)# 社团负责人 关联Student的主键 即studentNum学号 一对一的关系,on__delete 属性在django2.0之后为必填属性后面会介绍
unionRoot = models.OneToOneField(Student, on_delete=None)class Meta:
db_table = 'student_union'"""
OneToOneField: 一对一
ForeignKey: 一对多
ManyToManyField: 多对多(没有ondelete 属性)
"""
AI 代码解读

在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:


mysql> create database django_mysql;
Query OK, 1 row affected (0.01 sec)
AI 代码解读

创建完django_msql库之后,我们在终端执行如下命令,他的作用是将models文件生成一个迁移文件

 python3 manage.py makemigrations
AI 代码解读

8e100451afc8407a8bb54657e116606d498b9291

迁移文件生成完毕,执行


python3 manage.py migrate
AI 代码解读

会将迁移文件的内容作用到数据库中,生成表或者修改字段属性

控制台输出如下,则表示执行成功

(django_venv) xxxxxdeAir:djangoDemo xxxxx$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, app_demo, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying app_demo.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
AI 代码解读

查看我们的django_mysql数据库,其中student和student_union就是用models文件生成的表,其他的表是项目自动生成的,暂时可以先不用管

mysql> use django_mysql
Database changed
mysql> show tables;
+----------------------------+| Tables_in_django_mysql |
+----------------------------+| auth_group || auth_group_permissions || auth_permission || auth_user || auth_user_groups || auth_user_user_permissions || django_admin_log || django_content_type || django_migrations || django_session || student || student_union |
+----------------------------+12 rows in set (0.00 sec)
AI 代码解读

表结构

desc查看表结构

mysql> desc student;
+------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| studentNum | varchar(15) | NO | PRI | NULL | || name | varchar(20) | NO | | NULL | |
| age | int(11) | NO | | NULL | || sex | tinyint(1) | NO | | NULL | |
| mobile | varchar(15) | NO | UNI | NULL | || createTime | datetime(6) | NO | | NULL | |
| modifyTime | datetime(6) | NO | | NULL | |
+------------+-------------+------+-----+---------+-------+7 rows in set (0.00 sec)
AI 代码解读
mysql> desc student_union;
+--------------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | || unionName | varchar(20) | NO | | NULL | |
| unionNum | int(11) | NO | | NULL | || unionRoot_id | varchar(15) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
AI 代码解读

至此Django利用models文件创建数据库表的功能已经完毕。接下来用代码的方式演示一下Django如何进行增删改查

增加数据

为了提供一些测试数据,这里用for循环批量的加了几条简单的数据。

from app_demo.models import Studentimport random"""
插入测试数据
"""def insert(request):# 随机整数 作为学号for i in range(0, 5):
studentNum = int(random.uniform(0, 1) * 10000000000)# 从models文件中获取student对象
student = Student()# 给对象赋值
student.studentNum = studentNum
student.name = 'tom' + str(i)
student.age = 15
student.sex = random.choice([True, False])
student.mobile = int(random.uniform(0, 1) * 10000000000)# 插入数据
student.save()return HttpResponse('数据插入完毕')
AI 代码解读

urls.py 文件中 urlpatterns中配置

url(r'^insert/', views.insert)
AI 代码解读

浏览器中访问http://localhost:8000/insert/ 浏览器显示‘数据插入完毕’

查询数据库,发现有5天数据,也就是插入成功

mysql> select * from student;
+------------+------+-----+-----+------------+----------------------------+----------------------------+| studentNum | name | age | sex | mobile | createTime | modifyTime |
+------------+------+-----+-----+------------+----------------------------+----------------------------+| 1352687635 | tom2 | 15 | 1 | 941807449 | 2018-11-08 09:58:40.226856 | 2018-11-08 09:58:40.227002 || 5554311867 | tom0 | 15 | 0 | 1598619027 | 2018-11-08 09:58:40.203807 | 2018-11-08 09:58:40.203960 || 7302510986 | tom4 | 15 | 0 | 9602601619 | 2018-11-08 09:58:40.251479 | 2018-11-08 09:58:40.251682 || 847849420 | tom3 | 15 | 0 | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 09:58:40.238928 || 9962892430 | tom1 | 15 | 0 | 3265013828 | 2018-11-08 09:58:40.215488 | 2018-11-08 09:58:40.216106 |
+------------+------+-----+-----+------------+----------------------------+----------------------------+5 rows in set (0.00 sec)
AI 代码解读

查询数据

"""
查询
"""def find(request):#sql = 'select * from student'# django 也可以执行原生的sql语句#result = Student.objects.raw(sql)# 查询name = tom1的数据
result = Student.objects.filter(name='tom1')"""
result为<class 'django.db.models.query.QuerySet'>的对象
需要进行数据处理
"""
arr = []for i in result:
content = {'学号': i.studentNum, '姓名': i.name, '性别': i.sex}
arr.append(content)
print(arr)
print(type(arr))return HttpResponse(arr)
AI 代码解读

配置urls,浏览器访问localhost:8000/find/

c1da8374f557213950c7d1909d51010e96957c12

修改数据

"""
修改
"""def modify(request, studentNum):# 通过学号获取student对象
student = Student.objects.get(studentNum=studentNum)# 设置student的name为jack
student.name = 'jack'
student.save()return HttpResponse('修改成功.')
AI 代码解读

setting文件中的配置如下


 url(r'^modify/(?P<studentNum>\d+)', views.modify),
AI 代码解读

修改学号847849420的name为jack

149c0d9f6771ad093018810c2e605767b2c7b6c0

再次查询mysql数据库,发现name已经被更新成了jack


mysql> select * from student where studentNum='847849420';
+------------+------+-----+-----+-----------+----------------------------+----------------------------+| studentNum | name | age | sex | mobile | createTime | modifyTime |
+------------+------+-----+-----+-----------+----------------------------+----------------------------+| 847849420 | jack | 15 | 0 | 195276039 | 2018-11-08 09:58:40.238601 | 2018-11-08 10:22:46.403147 |
+------------+------+-----+-----+-----------+----------------------------+----------------------------+1 row in set (0.00 sec)
AI 代码解读

删除数据

"""
删除
"""def delete(request, studentNum):
student = Student.objects.get(studentNum=studentNum)
student.delete()return HttpResponse('删除成功.')
AI 代码解读

settings.py中urlpatterns的配置如下


url(r'^delete/(?P<studentNum>.+)', views.delete)
AI 代码解读

.+ 表示匹配多个字符(不包括换行等字符)

浏览器请求该视图

337251b5c7fc1e0309f933f11d5a91127e37e087

查询数据库,发现该数据已经被删除

mysql> select * from student where studentNum='847849420';
Empty set (0.01 sec)
AI 代码解读

原文发布时间为: 2018-11-15
本文作者: 程序员共成长
本文来自云栖社区合作伙伴“ 程序员共成长”,了解相关信息可以关注“
程序员共成长”。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
73530
分享
相关文章
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
202 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
本文介绍了一个基于Python协同过滤算法的旅游景点推荐系统,该系统采用Django框架、MySQL数据库、Bootstrap前端和echarts数据可视化技术,旨在为用户提供个性化的旅游推荐服务,提升用户体验和旅游市场增长。
833 9
基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
599 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
339 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
『Django』模型入门教程-操作MySQL
一个后台如果没有数据库可以说废了一半。日常开发中大多数时候都在与数据库打交道。Django 为我们提供了一种更简单的操作数据库的方式。 在 Django 中,模型(Model)是用来定义数据库结构的类。每个模型类通常对应数据库中的一个表,类的属性对应表中的列。通过定义模型,Django 的 ORM(Object-Relational Mapping)可以将 Python 对象映射到数据库表,并提供一套 API 来进行数据库操作。 本文介绍模型的用法。
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
180 82

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等