• Django框架之数据库ORM框架


    首先,我来介绍一下什么是ORM框架:

    O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。

    django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。

    使用django进行数据库开发的步骤如下:

    1. 配置数据库连接信息
    2. 在models.py中定义模型类
    3. 迁移
    4. 通过类和对象完成数据增删改查操作

    Django框架--ORM框架--数据库的关系,如下图所示:

    既然用到的数据库,那么我们就不得不提python中一个第三方模块pymysql

    1. 安装pymysql

    pip install PyMySQL

    2. 在Django工程的同名目录下的init文件中添加如下代码:

    from pymysql import install_as_MySQLdb
    
    install_as_MySQLdb()

    这两句代码主要作用是,让Django框架能够以ORM框架的方式调用PyMySQL模块。

    3. 修改数据库配置信息

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',  # 数据库主机
            'PORT': 3306,  # 数据库端口
            'USER': 'root',  # 数据库用户名
            'PASSWORD': 'mysql',  # 数据库用户密码
            'NAME': 'django_demo'  # 数据库名字
        }
    }

    4. 在MySQL数据库中创建数据库

    create database laowang charset=utf8;

    以上,我们所有的准备工作就已准备完毕了。

    那么,接下来我将为大家讲解一下ORM框架如何使用。

    想要使用ORM框架,我们就需要执行一下流程:

    1. 定义模型类

    2. 给模型类添加字段

    想要定义模型类,我们就需要知道什么是模型类,直白的说模型类就是数据库中的表,模型类中的属性就是数据表中的字段。

    from django.db import models
    
    #定义图书模型类BookInfo
    class BookInfo(models.Model):
        btitle = models.CharField(max_length=20)
        bpub_date = models.DateField()
        bread = models.IntegerField(default=0)
        bcomment = models.IntegerField(default=0)
        is_delete = models.BooleanField(default=False)
    
        class Meta:
            db_table = 'tb_books'  # 指明数据库表名
            

    注意:

      使用ORM框架定义模型类时,模型类会自动帮我们在数据表中创建一个ID字段用作数据表中的字段,并且这个字段是自增长的。

    3. 迁移

    当我们成功的定义了模型类以后,我们需要进行数据库迁移,否则数据库中不会生成数据表。

    迁移命令:

    # 生成数据库迁移文件
    python manage.py makemigrations
    
    # 执行数据库迁移文件
    python manage.py migrate

    提示:

    需要执行数据库迁移的子应用必须要在配置文件中进行注册

    当我们的定义的模型类增加新的字段时,也要重新迁移。

    当我们的数据表出现问题时,我们可以删除生成的迁移文件,然后重新迁移数据库。


    既然我们已经完成了,数据模型的定义,那么接下来我就带领大家对数据库中的数据使用ORM框架进行增删改查的操作。

     1. 使用ORM框架添加数据:

    # 第一种方式
    book = BookInfo(
        btitle='西游记',
        bput_date=date(1988,1,1),
        bread=10,
        bcomment=10
    )
    
    book.save()
    
    
    # 第二种方式
    BookInfo.objects.create(
        btitle='西厢记',
        bput_date=date(1988,1,1),
        bread=3540,
        bcomment=1230
        )

    2. 使用ORM框架删除数据:

    # 第一种方式
    BookInfo.objects.get(name='西游记').delete()

    3. 使用ORM框架修改数据:

    # 第一种方式
    book = BookInfo.objects.get(name='西游记')
    book.name = '西游记后传'
    book.save()
    
    
    # 第二种方式
    BookInfo.objects.filter(name='西厢记').update(name='儒林外史')

    4. 使用ORM框架查询数据:

    基本查询方式:

    # 第一种方式:查询全部数据
    BookInfo.objects.all()
    
    # 第二种方式:查询全部符合指定条件的数据
    BookInfo.objects.filter(id__gt=1)
    
    # 第三种方式:查询出一条符合条件的数据
    BookInfo.objects.get(name='西厢记')

    高级查询方式:

    '''
    模糊查询: 
        字段__contains='值'
        模型类.objects.filter(字段__contains='值')
    
    范围查询: 
        字段__in=[值1,....]
        模型类.objects.filter(字段__in=['值1',...])
    
    空查询:
        字段__isnull=True 为空
        字段__isnull=False 非空
        模型类.objects.filter(字段__isnull=True)
    
    比较查询:
        字段__gt=值 --> 大于
        字段__gte=值 --> 大于等于
        字段__lt=值 --> 小于
        字段__lte=值 --> 大于等于    
        模型类.objects.filter(字段__gt=值)
        模型类.objects.filter(字段__gte=值)    
    
    逻辑查询:
        F对象:两个端相互比较时使用F对象
            from django.db.models import F
            BookInfo.objects.filter(bread__gte=F('bcomment'))
    
        Q对象:一般是使用逻辑或(|)时使用Q对象
            from django.db.models import Q
            BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
    
    聚合函数:
        Avg(字段名) 平均,
        Count(字段名) 数量,
        Max(字段名) 最大,
        Min(字段名) 最小,
        Sum(字段名) 求和
        count() 统计数量
    
    排序:
        order_by(字段名)  # 升序
        order_by(-字段名)  # 降序
    
    关联查询:
        一对多查询:
            一关系的模型类.多关系模型类名小写_set.get/filter(查询条件)
            一关系的模型类.自定义的related_name的值.get/filter(查询条件)
    
        多对一查询:
            多关系的模型类.外键名.get/filter(查询条件)
    '''

    注意:

    使用filter、all查询出来的数据是一个查询集,不能直接使用,想使用需要将查询集便利出来。

    # 获取模型类集合
    book_model_list = BookInfo.objects.filter(id__gte=3)
    
    # 便利模型类,将集合中的模型便利出来
    
    for book_model in book_model_list:
        print(book_model.id)
        print(book_model.name)
    该花的钱要花,该吃的饭要吃。
  • 相关阅读:
    day37 多路复用IO模型之select select,poll,epoll 异步IO 数据库基本概念 配置文件管理
    day36 协程介绍/yield实现协程/补充/gevent模块/网络IO模型介绍/阻塞IO模型/非阻塞IO模型
    day35 GIL介绍 cpython解释器的垃圾回收机制 GIL与自定义互斥锁 多进程vs多线程 线程queue 进程池与线程池
    day34 线程介绍/开启线程的两种方式/进程vs线程/线程对象其他相关属性或方法/互斥锁/死锁现象与递归锁/信号量
    day33 守护进程、互斥锁、进程间通信、生产者消费者模型part1、生产者消费者模型part2、生产者消费者模型part3
    day 32 进程理论/开启子进程的两种方式/僵尸进程与孤儿进程/进程间内存空间隔离/join操作/进程对象其他相关属性或方法
    day31 基于udp协议套接字通信 udp协议通信循环原理分析 udp协议没有粘包问题/基于socketserver模块实现并发的套接字(tcp) 基于socketserver模块实现并发的套接字(udp) 进程的简单介绍 操作系统的功能介绍 操作系统的发展史
    day30 模拟ssh远程执行命令/解决粘包执行问题/粘包终极解决方案/tcp的优化算法以及粘包问题分析
    Unity3D游戏开发之MatchTarget实现角色攀爬效果
    javase学习第九天(抽象类与接口)
  • 原文地址:https://www.cnblogs.com/chao666/p/12178210.html
Copyright © 2020-2023  润新知