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之list和str比较
Sep 20 Python
Python3 处理JSON的实例详解
Oct 29 Python
Django视图和URL配置详解
Jan 31 Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 Python
python 从文件夹抽取图片另存的方法
Dec 04 Python
Python依赖包整体迁移方法详解
Aug 15 Python
python kafka 多线程消费者&amp;手动提交实例
Dec 21 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 Python
Python Serial串口基本操作(收发数据)
Nov 06 Python
python与idea的集成的实现
Nov 20 Python
python实战之用emoji表情生成文字
May 08 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
PHP中,文件上传
2006/12/06 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
jQuery动态显示和隐藏datagrid中的某一列的方法
2013/12/11 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
bootstrap输入框组件使用方法详解
2017/01/19 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
深入探究node之Transform
2017/07/20 Javascript
vue二级路由设置方法
2018/02/09 Javascript
深入浅出vue图片路径的实现
2019/09/04 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
什么是会话Bean
2015/05/14 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
音乐系毕业生自荐信
2013/10/27 职场文书
办理信用卡工作证明
2014/01/11 职场文书
2014政务公开实施方案
2014/02/19 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
反腐倡廉观后感
2015/06/08 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
Python pygame实现中国象棋单机版源码
2021/06/20 Python