• Django系列6-数据库操作


    一.Python 的数据库操作

    我们经常使用Python来操作数据库,用的最多的就是pymysql这个库

      import pymysql
      
      # 1.连接MySQL
      conn = pymysql.connect(host="127.0.0.1", port=3306, user='root', passwd="root123", charset='utf8', db='unicom')
      cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
      
      # 2.发送指令
      cursor.execute("insert into admin(username,password,mobile) values('admin','123456','15155555555')")
      conn.commit()
      
      # 3.关闭
      cursor.close()
      conn.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    二. Django中的数据库操作

    Django开发操作数据库更简单,内部提供了ORM框架。
    image.png

    2.1 安装第三方模块

    pip install mysqlclient
    
    • 1

    如果上面安装失败了,可以去下载对应的安装包来安装
    image.png

    2.2 ORM

    ORM可以帮助我们做两件事:

    1. 创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】
    2. 操作表中的数据(不用写SQL语句)。

    2.2.1 创建自己的数据库

    create database django_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    
    • 1

    image.png

    2.2.2 django连接数据库

    在settings.py文件中进行配置和修改。

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'django_test',  # 数据库名字
            'USER': 'root',
            'PASSWORD': 'abc123',
            'HOST': '127.0.0.1',  # 那台机器安装了MySQL
            'PORT': 3306,
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image.png

    django连接数据库可以参考官方文档:
    https://docs.djangoproject.com/zh-hans/3.2/ref/databases/

    2.2.3 django操作表

    1. 创建表
    2. 修改表
    3. 删除表

    2.2.3.1 创建表

    在models.py文件中
    image.png
    在models.py中增加了一个class,django会自动解析为如下sql:

    create table app01_userinfo(
        id bigint auto_increment primary key,
        name varchar(32),
        password varchar(64),
        age int
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行命令:

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    安装记录:

    (mysite2) E:\python\Django\mysite2>pip install pymysql
    Collecting pymysql
      Cache entry deserialization failed, entry ignored
      Using cached https://files.pythonhosted.org/packages/4f/52/a115fe175028b058df353c5a3d5290b71514a83f67078a6482cff24d6137/PyMySQL-1.0.2-py3-none-any.whl
    Installing collected packages: pymysql
    Successfully installed pymysql-1.0.2
    You are using pip version 10.0.1, however version 22.2.2 is available.
    You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    
    (mysite2) E:\python\Django\mysite2>
    (mysite2) E:\python\Django\mysite2>
    (mysite2) E:\python\Django\mysite2>python manage.py makemigrations
    Migrations for 'app01':
      app01\migrations\0001_initial.py
        - Create model UserInfo
    
    (mysite2) E:\python\Django\mysite2>python manage.py migrate
    System check identified some issues:
    
    WARNINGS:
    ?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
            HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: https://docs.djangoproject.com/en/3.2/ref/databases/#mysql-sql-mode
    Operations to perform:
      Apply all migrations: admin, app01, 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 app01.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 auth.0010_alter_group_name_max_length... OK
      Applying auth.0011_update_proxy_permissions... OK
      Applying auth.0012_alter_user_first_name_max_length... OK
      Applying sessions.0001_initial... OK
    
    (mysite2) E:\python\Django\mysite2>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    看看mysql数据库:
    image.png

    2.2.3.2 修改表

    在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据
    image.png

    执行命令:

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    image.png

    2.2.3.3 删除表

    我们直接把class 删除掉,然后再来看效果

    执行命令:

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    image.png

    2.2.4 ORM操作表中的数据

    models.py 文件

    from django.db import models
    
    # Create your models here.
    
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        age = models.IntegerField(default=2)
    
    
    class Department(models.Model):
        title = models.CharField(max_length=16)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    执行命令:

    python manage.py makemigrations
    python manage.py migrate
    
    • 1
    • 2

    url.py

    # django orm
        path('orm/', views.orm),
    
    • 1
    • 2

    views.py

    from app01.models import *
    
    def orm(request):
    
        #### 1.新建 ####
        Department.objects.create(title="销售部")
        Department.objects.create(title="IT部")
        Department.objects.create(title="运营部")
        UserInfo.objects.create(name="张三", password="123", age=19)
        UserInfo.objects.create(name="李四", password="666", age=29)
        UserInfo.objects.create(name="王五", password="666")
    
        #### 2.删除 ####
        UserInfo.objects.filter(id=3).delete()
        Department.objects.all().delete()
    
        #### 3.获取数据 ####
        #3.1 获取符合条件的所有数据
        #data_list = [对象,对象,对象]  QuerySet类型
        data_list = UserInfo.objects.all()
        for obj in data_list:
            print(obj.id, obj.name, obj.password, obj.age)
    
        #data_list = [对象,]
        data_list = UserInfo.objects.filter(id=1)
        print(data_list)
        #3.1 获取第一条数据【对象】
        row_obj = UserInfo.objects.filter(id=1).first()
        print(row_obj.name, row_obj.password, row_obj.age)
    
        #### 4.更新数据 ####
        UserInfo.objects.all().update(password=999)
        UserInfo.objects.filter(id=2).update(age=999)
        UserInfo.objects.filter(name="李四").update(age=999)
    
        return HttpResponse("成功")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    访问页面:
    访问指定页面就可以对数据库进行增删改查的操作了,那么也就可以通过页面的操作来操作数据库了,当然这个地方只是一个最简单的案例,后面会将具体的操作给补充上。

    三. 用户管理实例

    3.1 展示用户信息

    1. 新增URL
      image.png

    2. 新增views.py下面的函数
      这个步骤就是通过查询数据,将user_info下面的所有的数据都传入到前端html页面

    def info_list(request):
        # 1.获取数据库中所有的用户信息
        # [对象,对象,对象]
        data_list = UserInfo.objects.all()
    
        # 2.渲染,返回给用户
        return render(request, "info_list.html", {"data_list": data_list})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 新增html文件
    
    
    
        
        Title
    
    
    

    INFO列表

    添加> {% for obj in data_list %} {% endfor %}
    ID 姓名 密码 年龄 操作
    {{ obj.id }} {{ obj.name }} {{ obj.password }} {{ obj.age }} 删除
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    1. 访问页面
      添加和删除都只是增加了按钮,后面补充上对应的功能
      image.png

    3.2 新增用户

    上一步我们已经将按钮添加到用户列表页面了

    1. 新增url
      image.png

    2. views.py新增对应函数

    def info_add(request):
        if request.method == "GET":
            return render(request, 'info_add.html')
    
        # 获取用户提交的数据
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        age = request.POST.get("age")
    
        # 添加到数据库
        UserInfo.objects.create(name=user, password=pwd, age=age)
    
        # 自动跳转
        # return redirect("http://127.0.0.1:8000/info/list/")
        return redirect("/info/list")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 新增html文件
    
    
    
        
        Title
    
    
    

    添加用户

    {% csrf_token %}
    >
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 访问页面
      image.png
      image.png

    3.3 删除用户

    用户列表页面已经做了删除的按钮,此时只需将对应的id传到后端,然后后端调用对应函数进行删除即可

    1. 新增url
      image.png

    2. views.py新增对应函数
      从访问的url中获取id值,然后进行删除

    def info_delete(request):
        nid = request.GET.get('nid')
        UserInfo.objects.filter(id=nid).delete()
        return redirect("/info/list")
    
    • 1
    • 2
    • 3
    • 4
    1. 访问页面
      image.png

    image.png

    参考:

    1. https://www.bilibili.com/video/BV1NL41157ph

    FAQ

    1. django连接不上mysql

    django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
    解决方案:

    pip install pymysql
    
    • 1

    然后django项目初始化的时候加上

    import pymysql
    pymysql.install_as_MySQLdb()
    
    • 1
    • 2

    image.png

    2. django删表重建的办法

    1. 先到数据库把表删掉:drop table

    2. 注释django中对应的Model

    3. 执行命令
      python manage.py makemigrations
      python manage.py migrate --fake

    4. 去掉django中对应的Model的注释

    5. 执行命令
      python manage.py makemigrations
      python manage.py migrate

  • 相关阅读:
    JavaScript系列之switch语句
    【大厂高频真题100题】单词拆分Ⅱ 真题练习第8题 持续更新~
    【操作系统】进程同步与进程互斥
    详解设计模式:代理模式
    2022年天然橡胶市场供需与价格走势
    JavaScript基础 JavaScript第二天 1. 运算符
    详解K8S入口Ingerss
    注释Java
    VLAN 综合实验
    [vue]在鼠标点击处,画点,并弹窗显示两个点的距离
  • 原文地址:https://blog.csdn.net/u010520724/article/details/126777133