一:pycharm链接数据库(MySQL)

1.pycharm右侧Database工具栏
  1. 三个位置查找数据库相关
  2. 1.右侧上方database
  3. 2.左下方database
  4. 3.配置里面的plugins插件搜索安装
  5. 注意:
  6. 都没有再没有卸载pycharm重新装

2.下载对应的驱动,填写MySQL数据库信息连接(当前为客户端)

pycharm可以充当很多款数据库软件的客户端

3.pycharm连接MySQL数据库

二:django链接数据库(MySQL)

1.修改配置文件中数据库设置成django连接MySQL

  1. # django配置文件中默认用的是sqlite3数据库
  2. DATABASES = {
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.sqlite3',
  5. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  6. }
  7. }
  8. # django链接MySQL(修改sqlite3数据库)
  9. 1.第一步配置文件中配置
  10. DATABASES = {
  11. 'default': {
  12. 'ENGINE': 'django.db.backends.mysql', # 修改成MySQL数据库
  13. 'NAME': 'day60', # 连接数据库名称 先创建好才能指定
  14. 'USER':'root', # 数据库名称
  15. 'PASSWORD':'admin123', # 数据库密码
  16. 'HOST':'127.0.0.1', # 数据库ip 本地回环地址
  17. 'PORT':3306, # 数据库端口
  18. 'CHARSET':'utf8' # 指定字符编码
  19. }
  20. }
2.手动将默认mysqldb改为pymysql
  1. 2.代码声明 在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
  2. django默认用的是mysqldb模块链接MySQL
  3. 但是该模块的兼容性不好 需要手动改为用pymysql链接
  1. import pymysql
  2. pymysql.install_as_MySQLdb() # pyMySQL取代MySQLDB

三:Django ORM

1.ORM简介
  1. """
  2. ORM:对象关系映射
  3. 作用:目的就是为了能够让不懂SQL语句的人通过python面向对象的知识点也能够轻松自如的操作数据库
  4. 缺陷:封装程度太高,有时候sql语句的效率偏低,需要自己写SQL语句
  5. """
  6. ---------------->>>
  7. 对象 --------------->>> 表里面的数据
  8. 对象点属性 ---------->>> 字段对应的值

2.模型类需要写在应用下的models.py文件中
  1. # 必须要继承父类
  2. class User(models.Model):
  3. # id int primary_key auto_increment
  4. id = models.AutoField(primary_key=True)
  5. # username varchar(32) # CharField必须要加max_length参数,不加报错
  6. username = models.CharField(max_length=32)
  7. # password int
  8. password = models.IntegerField()
3.数据库迁移命令(非常重要)
  1. 打开terminal输入命令
  2. ********************************************************************
  3. 2 数据库迁移命令 将操作记录记录到(migrations文件夹)
  4. python3 manage.py makemigrations
  5. 2.将操作真正的同步到数据库中
  6. python3 manage.py migrate
  7. ********************************************************************
  1. 警记*****:
  2. 只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令
4.数据库同步

5.针对主键字段
  1. class User(models.Model):
  2. # id int primary_key auto_increment
  3. id = models.AutoField(primary_key=True,verbose_name='主键')
  4. # username varchar(32)
  5. username = models.CharField(max_length=32,verbose_name='用户名')
  6. """
  7. CharField必须要指定max_length参数 不指定会直接报错
  8. verbose_name该参数是所有字段都有的 就是用来对字段的解释
  9. """
  10. # password int
  11. password = models.IntegerField(verbose_name='密码')
  12. class Author(models.Model):
  13. # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
  14. # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段
  15. # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写
  16. # username varchar(32)
  17. username = models.CharField(max_length=32)
  18. # password int
  19. password = models.IntegerField()

四:字段的增删改查

1.字段的增加
  1. 1.可以在终端内直接给出默认值
  2. 2.该字段可以为空
  3. info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
  4. 3.直接给字段设置默认值
  5. hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
2.字段的修改
  1. 直接修改代码 然后执行数据库迁移的两条命令即可!
3.字段的删
  1. 直接注释对应的字段然后执行数据库迁移的两条命令即可!
  2. 执行完毕之后字段对应的数据也都没有了
  3. 删除字段(注意):
  4. 在操作models.py的时候一定要细心
  5. 千万不要注释一些字段
  6. 执行迁移命令之前最好先检查一下自己写的代码

五:数据的增删改查

1.查询数据
  1. # select * from user where username='jason':
  2. user_obj = models.User.objects.filter(username=username).first()
  3. """
  4. 返回的结果是一个querySet对象 你可以把它看成是一个列表套数据对象格式
  5. [数据对象1, 数据对象2...]
  6. """
  7. 它也支持索引取值 切片操作 但是不支持负数索引
  8. 它也不推荐你使用索引的方式取值,而是使用封装好的 .first()方法
  9. filter括号内可以携带多个参数 参数与参数之间默认是and关系
  10. 你可以把filter连想成where记忆
  • views.py文件
  1. from django.shortcuts import render, HttpResponse
  2. from app01 import models
  3. # 登录
  4. def login(request):
  5. # 返回一个登录界面
  6. """
  7. get请求和post请求应该有不同的处理机制
  8. :param request: 返回请求方式 并且是全大写的字符串形式
  9. :return:
  10. """
  11. if request.method == 'POST':
  12. # 获取页面用户的用户名和密码 然后利用orm操作数据 效验数据是否正确
  13. username = request.POST.get('username')
  14. # select * from user where username='jason':
  15. password = request.POST.get('password')
  16. # 去数据库中查询数据
  17. # print(password)
  18. # 1.导入models文件
  19. from app01 import models
  20. # 获取数据库内存储的用户名与密码
  21. user_obj = models.User.objects.filter(username=username).first()
  22. # <QuerySet [<User: User object>]> [数据对象1, 数据对象2...]
  23. if user_obj:
  24. # 页面用户输入密码对比数据库存储密码是否一致
  25. if password == user_obj.password:
  26. return HttpResponse('登录成功')
  27. else:
  28. return HttpResponse('密码错误')
  29. else:
  30. return HttpResponse('用户不存在')
  31. # GET返回html页面文件
  32. return render(request, 'login.html')

2.添加数据
  • 第一种增加
  1. from app01 import models
  2. res = models.User.objects.create(username=username,password=password)
  3. # 返回值就是当前被创建的对象本身
  • 第二种增加
  1. # 类加对象实列化产生了对象
  2. user_obj = models.User(username=username,password=password)
  3. # 对象调封装的方法 保存数据
  4. user_obj.save()
3.注册功能

  1. def register(request):
  2. if request.method == 'POST':
  3. username = request.POST.get('username')
  4. password = request.POST.get('password')
  5. # 直接获取用户数据存入数据库
  6. # 导入models
  7. from app01 import models
  8. res = models.User.objects.create(username=username,password=password)
  9. # 返回值就是当前被创建的对象本身
  10. print(res)
  11. # 第二种增加
  12. # 类加对象实列化产生了对象
  13. # user_obj = models.User(username=username,password=password)
  14. # 对象调封装的方法 保存数据
  15. # user_obj.save()
  16. # 先给用户返回一个注册页面
  17. return render(request,'reg.html')

六:前端(数据的查,改,删)

1.需求
  1. 先将数据库中的数据全部展示到前端 然后给每一个数据两个按钮 一个编辑一个删除
2.查
  1. # 展示用户功能
  2. def userlist(request):
  3. # 查询出用户表里面所以的数据
  4. # 方式1
  5. # data = models.User.objects.filter() # filter类似于where
  6. # 方式2
  7. user_queryset = models.User.objects.all() # 获取表内所有数据
  8. # <QuerySet [<User: objk>, <User: oscas>, <User: zll>...]>
  9. # locals() 将当前名称空间中的名字全部传递给html文件
  10. return render(request, 'userlist.html',locals())
3.改
  1. 1.点击编辑按钮朝后端发送编辑数据的请求
  2. 2.如何告诉后端用户想要编辑哪条数据?
  3. 将编辑按钮所在的那一行数据的主键值发送给后端
  4. 利用url问号后面携带参数的方式
  • 前端修改

  1. {# 当用户点击a标签 a标签会向edit_user 发送一个get请求 #}
  2. {# ?问号后面的参数不参与路径匹配 获取当前用户点击对应的主键值 #}
  3. <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
  4. <a href="" class="btn btn-danger btn-xs">删除</a>
  • 后端修改
  1. # 修改数据的方式1
  2. # models.User.objects.filter(id=edit_id).update(username=username, password=password)
  3. """
  4. 将filter查询出来的列表中所有的对象全部更新 批量更新操作
  5. """
  6. # 修改数据的方式2
  7. edit_obj.username = username
  8. edit_obj.password = password
  9. edit_obj.save()
  10. """
  11. 上述方法当字段特别多的时候效率会非常低
  12. 从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
  13. """
  • userlist.html
  1. <tbody>
  2. {#模板语法 for + tab#}
  3. {% for user_obj in user_queryset %}
  4. <tr>
  5. <td>{{ user_obj.id }}</td>
  6. <td>{{ user_obj.username }}</td>
  7. <td>{{ user_obj.password }}</td>
  8. <td>
  9. {# 当用户点击a标签 a标签会向edit_user 发送一个get请求 #}
  10. {# ?问号后面的参数不参与路径匹配 获取当前用户点击对应的主键值 #}
  11. <a href="/edit_user/?user_id={{ user_obj.id }}" class="btn btn-primary btn-xs">编辑</a>
  12. <a href="" class="btn btn-danger btn-xs">删除</a>
  13. </td>
  14. </tr>
  15. {% endfor %}
  16. </tbody>
  1. 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
  2. # 编辑用户功能
  3. def edit_user(request):
  4. # 获取url问号后面的主键值参数
  5. edit_id = request.GET.get('user_id')
  6. # 查询当前用户想要编辑的数据对象
  7. edit_obj = models.User.objects.filter(id=edit_id).first() # 拿到的是一个列表.first
  8. # 判断用户是否是POST请求
  9. if request.method == "POST":
  10. # 获取用户名和密码
  11. username = request.POST.get('username')
  12. password = request.POST.get('password')
  13. # 去数据库中修改对应的数据内容
  14. # 修改数据的方式1
  15. # models.User.objects.filter(id=edit_id).update(username=username, password=password)
  16. """
  17. 将filter查询出来的列表中所有的对象全部更新 批量更新操作
  18. """
  19. # 修改数据的方式2
  20. edit_obj.username = username
  21. edit_obj.password = password
  22. edit_obj.save()
  23. """
  24. 上述方法当字段特别多的时候效率会非常低
  25. 从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
  26. """
  27. # 跳转到数据展示页面
  28. return redirect('/userlist/')
  29. # 将数据对象展示到页面上
  30. return render(request, 'edit_user.html', locals())

4.删

  1. # 删除功能
  2. models.User.objects.filter(id=delete_id).delete()
  3. """
  4. delete:
  5. 批量删除
  6. """
  1. def delete_user(request):
  2. # 获取用户想要删除的数据id值
  3. delete_id = request.GET.get('user_id')
  4. # 直接去数据库中找到对应的数据删除即可
  5. models.User.objects.filter(id=delete_id).delete()
  6. """
  7. delete:
  8. 批量删除
  9. """
  10. # 跳转到页面
  11. return redirect('/userlist/')
  1. 知识储备:
  2. # 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是将字段修改一个状态
  3. username password is_delete
  4. jason 123 0
  5. egon 123 1

七:实现效果

Django连接数据库(mysql)与Django ORM实操(增删改查) 前端页面的更多相关文章

  1. [Django框架 - 静态文件配置、request对象方法初识、 pycharm链接数据库、ORM实操增删改查、django请求生命周期]

    [Django框架 - 静态文件配置.request对象方法初识. pycharm链接数据库.ORM实操增删改查.django请求生命周期] 我们将html文件默认都放在templates文件夹下 将 ...

  2. Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查

    本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...

  3. Django 之 文件配置、pycharm及django连接数据库、创表及表的增删改查02

    目录 创建项目后的文件夹配置 静态文件配置 接口前缀动态绑定 form表单回顾 根据请求方式的不同,返回前端不同的信息 pycharm 连接MYSQL数据库 Django 连接MYSQL数据库的配置 ...

  4. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  5. 用SpringBoot+MySql+JPA实现对数据库的增删改查和分页

    使用SpringBoot+Mysql+JPA实现对数据库的增删改查和分页      JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述 ...

  6. django -- ORM实现作者增删改查

    前戏 前面我们已经实现了出版社的增删改查,书的增删改查,书和出版社的对应关系.现在来写一下作者的增删改查和书的对应关系,那书和作者有什么关系呢?一个作者可以写多本书,一本书可以有多个作者,所以书和作者 ...

  7. django -- ORM实现图书增删改查

    表结构设计 上篇我们实现了出版社的增删改查,出版社数据表有两个字段id和name,那图书的表结构怎么设计呢?图书也要有一个主键id,还要有一个名称title,是哪个出版社的,要有个字段press和Pr ...

  8. django -- ORM实现出版社增删改查

    前戏 我们来完成一个图书管理系统的增删改查 表结构设计 1. 出版社 id   name 2. 作者 id  name 3. 书 id  title  出版社_id 4. 作者_书_关系表 id  书 ...

  9. Python Web实战:Python+Django+MySQL实现基于Web版的增删改查

    前言 本篇使用Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能,旨在快速入门Python Web,少走弯路.效果演示在项目实战最 ...

  10. 使用轻量级ORM Dapper进行增删改查

      项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司 ...

随机推荐

  1. Beats & FileBeat

    Beats是一个开放源代码的数据发送器.我们可以把Beats作为一种代理安装在我们的服务器上,这样就可以比较方便地将数据发送到Elasticsearch或者Logstash中.Elastic Stac ...

  2. 创建Grafana Dashboard

    输入表达式,获取数据 但是考虑到多台主机,需要添加变量来选择不同主机,从而出现相应的图表 点击右上角齿轮一样的图标,这个是设置 通过在prometheus界面查询可知,可以设置的变量有两个 考虑到这俩 ...

  3. CentOS 7.9 安装 nginx-1.22.0

    一.CentOS 7.9 安装 nginx-1.22.0 下载地址:http://nginx.org/en/download.html 2 安装前的准备 # 操作系统内核版本 uname -a # 操 ...

  4. 洛谷P1884 [USACO12FEB]Overplanting S (矩形切割)

    一种矩形切割的做法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const in ...

  5. numpy中的一些常用的关键字用法

    1.np.full() 原型:numpy.full(shape, fill_value, dtype=None, order='C') eg: 2.np.flatten():该函数返回一个折叠成一维的 ...

  6. 运行eeui项目不出现 WiFI真机同步 IP地址

    从git上 clone项目之后,安装依赖  npm install eeui环境配置    npm install eeui-cli -g 问题:npm run dev  后项目一直不出现 WiFI真 ...

  7. Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化

    参考书籍<mysql是怎样运行的> 非常推荐这本书,通俗易懂,但是没有讲mysql主从等内容 书中还讲解了本文没有提到的子查询优化内容, 本文只总结了常见的子查询是如何优化的 系列文章目录 ...

  8. 一篇文章带你了解NoSql数据库——Redis简单入门

    一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...

  9. Droplet——一款轻量的Golang应用层框架

    Github地址 如标题所描述的,Droplet 是一个 轻量 的 中间层框架,何为中间层呢? 通常来说,我们的程序(注意这里我们仅仅讨论程序的范围,而非作为一个系统,因此这里不设计如 LB.Gate ...

  10. SQL生成脚本

    右键要生成脚本的数据库 选择task 选择Generate script 选择需要生成脚本的table.view.procedure