• django的orm框架基础使用


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    ORM全称Object Relational Mapping,即对象关系映射,是在pymysql之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行.
    现在可以使用mysqlclient,mysqldb模块来替代pymysql
    本文是在学习银角大王-武沛齐发的视频教程后写的笔记,具体教程,请看下面这个链接
    https://www.bilibili.com/video/BV1rT4y1v7uQ/?p=44&spm_id_from=pageDriver&vd_source=990d3b5b184b6b39de1d6b6497619ae1


    一、准备工作

    1.第三方库的安装

    我们需要安装django和mysqlclient

    pip install django
    pip install mysqlclient 
    
    • 1
    • 2

    2.创建一个数据库

    我们电脑上首先要有数据库才行,这里使用的是MySQL8.028
    这里给个mysql下载链接
    https://downloads.mysql.com/archives/installer/
    这里给出一个数据库安装的教程
    MySQL 8.0保姆级下载、安装及配置教程(我妈看了都能学会)
    操作mysql数据库比较方便的可视化工具是navicat,建议下15版本,老版本很早就破解了
    这里给个破解教程
    这里给个navicat的下载链接
    http://www.itmop.com/downinfo/407970.html
    这里给个破解软件的下载链接
    https://www.golue.com/game/v679383.html
    这里给个教程
    [防呆破解操作] Navicat Premium 15安装破解教程

    注意,有钱还是要支持一下正版软件

    下面来创建一个数据库,供我们后续使用

    create database gx_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    
    • 1

    二、连接数据库

    django在默认的情况下,是连接sqlite,我们需要把这个设置给修改一下,让它连接mysql
    关于修改这个东西,有耐心的同学可以阅读一下上面注释中的文档。下面说说修改成什么样子
    在这里插入图片描述
    修改见下面这段代码

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',# 使用MySQL
            'NAME': "gx_day15",# 要连接的数据库叫什么名字
            'USER':'root',# 账号
            'PASSWORD':"",# 密码
            'HOST':"127.0.0.1",# MySQL在哪里,这里我们是在本机上就这样写
            # 或者写localhost
            'POST':3306,# 端口号,mysql的端口默认就是3306
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    经过这样修改,django就可以连接上我们的数据库

    三、创建表和修改表的结构

    创建一张表以及表的结构

    django里面创建表,就是写类

    向下面这样写,就是创建了一张表
    其中,导入是固定的,class一行的代码除了UserInfo,其他也是固定的
    class下面就是表的结构

    from django.db import models
    
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        age = models.IntegerField()
    """
    create table app01_userinfo(
        id bigint auto_increment primary key ,
        name varchar (32),
        password varchar (64),
        age int  
    )
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注意,这个时候程序还没有运行,所以数据库里面没有这个表
    我们需要运行下面两个命令(对,你没看错,是需要在命令行运行的命令)
    注意!!!顺序不能变,必须在manage的路径里运行

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

    运行出来后是类似这样的,如果你第一次运行,会长一点
    (没有error,warming,数据库中有表就说明成功了)
    在这里插入图片描述

    关于我遇到的bug进行说明

    1.

    在这里插入图片描述
    如果你遇到上面的error,请你看看在设置的时候,你的密码是否写对了

    2.

    在这里插入图片描述
    如果你遇到这个bug
    如果你使用的是anaconda,请确保你在你的虚拟环境里运行上面的命令,就像这样
    在这里插入图片描述

    如果你的电脑上有多个python,请确保在上面的命令中的python是你跑程序的那个python

    如果你已经确定上面都是对的,请确定你的mysqlclient的版本是多少
    我们使用的mysqlclient对版本有一定要求,要求在1.40以上,你可以使用下面命令来变更版本

    pip uninstall mysqlclient
    pip install mysqlclient==1.44
    
    • 1
    • 2

    创建多张表

    如何创建多张表,想必你也一定知道了,只要多写几个class类就行了,这里不再进行演示了

    关于如何删除已经创建好的表的一些结构

    这个在django也很简单,只要把你想删除的结构给注释掉就行了,就像下面这样

    from django.db import models
    
    class UserInfo(models.Model):
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        # age = models.IntegerField()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    关于如何给已经创建好的表添加结构

    这个也很简单,直接写就行了,这里不做演示,但是要说一个问题,
    如果我们要在一个有数据的表中,新添加一个结构,也就是一列,那新添加的表的数据应该是什么?
    这里django给了两个选项,见下图
    在这里插入图片描述
    第一个选项就是说,现在就给它添加一个默认值,
    第二选项就是说,先退出,然后自己在代码中添加一个默认值
    一般是下面两种选择

    age = models.InterField(default=2)# 设置一个默认值
    data = models.IntegerField(null=True,blank=True)# 默认为空
    # 注意,其他类型的空值不一定这样写,请自行查阅
    
    • 1
    • 2
    • 3

    四、增删改查

    注意!!! UserInfo是我们上面创建表时写的类,你用代码时需要改成你创建表时写的类名

    UserInfo.objects.create(name="xx",password="111",age="11")
    # 这句话就相当于insert语句,请注意,有些字段是否能添加空值,如果不能,这句代码是会报错的
    # () 里还有其他写法,知道这种写法就足够了
    
    • 1
    • 2
    • 3

    # 筛选后删除
    UserInfo.objects.filter().delete()
    # 将整个表的数据给删除
    Department.objects.all().delete()
    
    • 1
    • 2
    • 3
    • 4

    查找数据

    1.查全表数据

    orm中相当于的代码

    select * from 表名;
    
    • 1

    data_list = UserInfo.objects.all();
    
    • 1

    注:这个代码会返回一个queryset类型的列表,列表中的每一个元素就是数据库中的一行数据,需要使用orm中特定的方法来取数据。

    data_list = UserInfo.objects.all()
    for obj in data_list:
    	print(obj.id,obj.name,obj.password,obj.age)
    
    • 1
    • 2
    • 3

    对表进行筛选

    data_list = UserInfo.objects.filter(id=1)
    
    • 1

    修改数据

    UserInf.objects.filter(id=2).update(age=999)
    
    • 1

    总结

    orm框架总体来说,还是比较好用的。我个人感觉,这个框架最大的好处在于,可以快速连接多种数据库,快速上手,毕竟我接触orm的时间远远小于我学习SQL的时间。可能我学SQL的经验也给我快速上手orm也提供了帮助吧

  • 相关阅读:
    极智Paper | YOLOS 通过目标检测重新思考Vision Transformer
    Dubbo和Spring集成Demo
    【入门篇】UML-FlowChat流程图
    普莱得电器IPO过会:拟募资5.6亿 为杨伟明及韩挺两家族控制
    RDS - 远程桌面服务
    探析共享股东模式:创新的商业模式引领共享经济发展
    基于日期、时间、经纬度下载MODIS数据并批处理
    苹果的小型开发者计划现在允许账号间转让app
    利用角色roles上线wordpress项目
    Python 从底层结构聊 Beautiful Soup 4(内置豆瓣最新电影排行榜爬取案例)
  • 原文地址:https://blog.csdn.net/wish_you_luck/article/details/127022102