侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

django+mysql的使用示例

数据库  /  管理员 发布于 6年前   183

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 pymysqlpymysql.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_mysqlDatabase changedmysql> 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 Studentimport 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),

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)

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


  • 上一条:
    Django中数据库的数据关系:一对一,一对多,多对多
    下一条:
    Django中更改默认数据库为mysql的方法示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 分库分表的目的、优缺点及具体实现方式介绍(0个评论)
    • DevDB - 在 VS 代码中直接访问数据库(0个评论)
    • 在ubuntu系统中实现mysql数据存储目录迁移流程步骤(0个评论)
    • 在mysql中使用存储过程批量新增测试数据流程步骤(0个评论)
    • php+mysql数据库批量根据条件快速更新、连表更新sql实现(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-06
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-05
    • 2018-10
    • 2018-11
    • 2020-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2021-02
    • 2021-04
    • 2021-07
    • 2021-08
    • 2021-11
    • 2021-12
    • 2022-02
    • 2022-03
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客