django+mysql的使用
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
在这里插入图片描述
迁移文件生成完毕,执行
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/
在这里插入图片描述
修改数据
"""
修改
"""
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),
修改学号847849420的name为jack
在这里插入图片描述
再次查询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)
.+ 表示匹配多个字符(不包括换行等字符)
浏览器请求该视图
在这里插入图片描述
查询数据库,发现该数据已经被删除
mysql> select * from student where studentNum='847849420';
Empty set (0.01 sec)
关注公众号「程序员共成长」(id: finishbug)。给新加入的小伙伴准备了丰厚的见面礼,包括但不限于:Python、Java、Linux、大数据、人工智能、前端等21个技术方向,后台回复"礼包"即可领取。
django+mysql的使用的更多相关文章
- Ubuntu14.04 Django Mysql安装部署全过程
Ubuntu14.04 Django Mysql安装部署全过程 一.简要步骤.(阿里云Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便 ...
- Ubuntu 14.04下Django+MySQL安装部署全过程
一.简要步骤.(Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便一些有需要的童鞋,大神勿喷~ 二.Python的安装 由于博主使用的环境是 ...
- 在MAC下 Python+Django+mysql配置
今天在搭建Django+mysql环境的时候遇到了一点问题,记录下来. 安装环境:OS X 10.10操作系统,Python 2.7. MySQLdb其实包含在MySQL-python包中,因此无论下 ...
- centos6.5+Django+mysql+nginx+uwsgi
centos6.5+Django+mysql+nginx+uwsgi 1.nginx的安装.这里采用nginx-1.6.0, 建立一个shell脚本然后执行. #!/bin/bash nginx_ve ...
- Django mysql应用
环境:python3.Django2 1.安装驱动mysqlclient pip3 install mysqlclient 2.创建一个数据库 CREATE DATABASE database_nam ...
- Django基础学习七之如何配置django+mysql
很久没有更新博客了,也有段时间没有持续性的学习了,感觉堕落了,今天继续开始学习吧 今天主要来学习一下在django下配置mysql的数据库和使用admin用户管理数据库 1.在project中的set ...
- 【转】Ubuntu 14.04下Django+MySQL安装部署全过程
一.简要步骤.(阿里云Ubuntu14.04) Python安装 Django Mysql的安装与配置 记录一下我的部署过程,也方便一些有需要的童鞋,大神勿喷~ 二.Python的安装 由于博主使用的 ...
- django mysql setting 设置
django mysql setting django mysql 设置 DATABASES = { 'default': { 'ENGINE': 'django.db.back ...
- Django MySQL 数据库连接
Django 1.11 官方文档 常规说明 数据库连接 CONN_MAX_AGE 定义数据库连接时限(ALL) default:0 保存在每个请求结束时关闭数据库连接的历史行为. None:保持长连接 ...
- Python Web实战:Python+Django+MySQL实现基于Web版的增删改查
前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...
随机推荐
- 关于引用(python中的伪指针)的理解
# 总结:个人理解,引用不可变的的变量时,随着改变会指向新的地址 # 引用可变的变量时,位置不会随着变量改变而改变 a = 1 b = a print(b) a = 2 # 指向了新的内存地址 pri ...
- Linux(二十二)Ubuntu安装和配置
Ubuntu的介绍 Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu是基于GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球化的专业开发团队(Ca ...
- js中几种实用的跨域方法原理详解【转】
源地址:http://www.cnblogs.com/2050/p/3191744.html 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通 ...
- C++ 模板基础
我们学习使用C++,肯定都要了解模板这个概念.就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数:进而实现了真正的代码可重用性.模版可 ...
- echarts3 迁徙图 迁入迁出
geoCoordMap = { '上海': [121.4648,31.2891], '佛山': [112.8955,23.1097], '保定': [115.0488,39.0948], '兰州': ...
- Docker的安装和测试
1,Docker安装 Docker是啥,以及其与虚拟机的对比,就不介绍了,网上有很多资源可以学习和了解. 本篇文章重点介绍Docker的安装和测试使用. Docker的安装,分为离线安装和在线安装两种 ...
- jquery 获取jquery对象的标签类型
//jquery 对象 $("#"+控件id)[0] //查看控件类型 $("#"+控件id)[0].type 实例1: < select id=&qu ...
- 深入出不来nodejs源码-编译启动(1)
整整弄了两天,踩了无数的坑,各种奇怪的error,最后终于编译成功了. 网上的教程基本上都过时了,或者是版本不对,都会报一些奇怪的错误,这里总结一下目前可行的流程. node版本:v10.1.0. 首 ...
- poj 1696 极角排序求最长逆时针螺旋线
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4970 Accepted: 3100 Descrip ...
- Spring MVC 的 Java Config ( 非 XML ) 配置方式
索引: 开源Spring解决方案--lm.solution 参看代码 GitHub: solution/pom.xml web/pom.xml web.xml WebInitializer.java ...