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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
Python类定义和类继承详解
May 08 Python
python实现矩阵乘法的方法
Jun 28 Python
django+xadmin+djcelery实现后台管理定时任务
Aug 14 Python
python中强大的format函数实例详解
Dec 05 Python
python文件选择对话框的操作方法
Jun 27 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
Jan 09 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
Python文件名匹配与文件复制的实现
Dec 11 Python
python字符串的一些常见实用操作
Apr 06 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
PHP递归调用数组值并用其执行指定函数的方法
2015/04/01 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
2010/02/26 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
2016/10/10 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
python 文件操作api(文件操作函数)
2016/08/28 Python
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
python 图像增强算法实现详解
2021/01/24 Python
HTML5中在title标题标签里设置小图标的方法
2020/06/23 HTML / CSS
PHP如何删除一个Cookie值
2012/11/15 面试题
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
大学生职业生涯规划方案
2014/01/03 职场文书
如何写你的创业计划书
2014/01/07 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
保护野生动物倡议书
2014/05/16 职场文书
节能标语大全
2014/06/21 职场文书
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
Flask response响应的具体使用
2021/07/15 Python