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从ftp下载数据保存实例
Nov 20 Python
python实现目录树生成示例
Mar 28 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
python连接mongodb集群方法详解
Feb 13 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
如何提高python 中for循环的效率
Apr 15 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
Python实现CAN报文转换工具教程
May 05 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
JavaScript 原型继承
2011/12/26 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
Python selenium自动化测试模型图解
2020/04/15 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
运动会演讲稿
2014/05/07 职场文书
市场营销专业求职信
2014/06/17 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
离职告别感言
2015/08/04 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
nginx实现动静分离的方法示例
2021/11/07 Servers
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis
Consul在linux环境的集群部署
2022/04/08 Servers
pt-archiver 主键自增
2022/04/26 MySQL