django+mysql的使用示例


Posted in Python onNovember 23, 2018

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

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, # 端口

 }
}

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

安装pymysql

pip3 install pymysql

项目中配置

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

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

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

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

在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 属性)
"""

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

mysql> create database django_mysql;
Query OK, 1 row affected (0.01 sec)

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

python3 manage.py makemigrations

django+mysql的使用示例

迁移文件生成完毕,执行

python3 manage.py migrate

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

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

(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

查看我们的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)

表结构

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)
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)

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

增加数据

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

from app_demo.models import Student
import 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('数据插入完毕')

urls.py 文件中 urlpatterns中配置

url(r'^insert/', views.insert)

浏览器中访问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)

查询数据

"""
查询
"""
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)

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

django+mysql的使用示例 

修改数据

"""
修改
"""
def modify(request, studentNum):
 # 通过学号获取student对象
 student = Student.objects.get(studentNum=studentNum)
 # 设置student的name为jack
 student.name = 'jack'
 student.save()
 return HttpResponse('修改成功.')
setting文件中的配置如下

url(r'^modify/(?P<studentNum>\d+)', views.modify),

setting文件中的配置如下

url(r'^modify/(?P<studentNum>\d+)', views.modify),

修改学号847849420的name为jack

django+mysql的使用示例

再次查询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)

删除数据

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

settings.py中urlpatterns的配置如下

url(r'^delete/(?P<studentNum>.+)', views.delete)

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

浏览器请求该视图

django+mysql的使用示例

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

mysql> select * from student where studentNum='847849420';
Empty set (0.01 sec)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现备份文件实例
Sep 16 Python
python文件写入实例分析
Apr 08 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
Python2.x与Python3.x的区别
Jan 14 Python
举例讲解Python中的list列表数据结构用法
Mar 12 Python
Python求出0~100以内的所有素数
Jan 23 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
jupyter notebook 增加kernel教程
Apr 10 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 #Python
Windows下Python3.6安装第三方模块的方法
Nov 22 #Python
Python第三方Window模块文件的几种安装方法
Nov 22 #Python
python实现归并排序算法
Nov 22 #Python
Python的iOS自动化打包实例代码
Nov 22 #Python
详解如何用django实现redirect的几种方法总结
Nov 22 #Python
PyGame贪吃蛇的实现代码示例
Nov 21 #Python
You might like
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php中的静态变量的基本用法
2014/03/20 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
JavaScript基本对象
2007/01/11 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
js创建jsonArray传输至后台及后台全面解析
2016/04/11 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
package.json中homepage属性的作用详解
2020/03/11 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
python 异常处理总结
2016/10/18 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
python实现批量命名照片
2020/06/18 Python
大学毕业生的自我鉴定
2013/11/30 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL