计算机基础知识54

news2024/11/21 2:36:19

 ORM的介绍

# ORM是什么?

        我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。

# ORM的概念:

        ORM全称Object Relational Mapping,即对象关系映射,是在pymysq之上又进行了一层封装,对于数据的操作,我们无需再去编写原生sql,取代代之的是基于面向对象的思想去编写类、对象、调用相应的方法等,ORM会将其转换/映射成原生SQL然后交给pymysql执行

ORM的使用之数据库迁移

1、创建模型:数据来源于数据库的表,而ORM的模型类对应数据库表

# 创建django项目,新建名为app01的app,在app01的models.py中创建模型
class Employee(models.Model):  # 必须是models.Model的子类
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=16)
    gender=models.BooleanField(default=1)
    birth=models.DateField()
    department=models.CharField(max_length=30)
    salary=models.DecimalField(max_digits=10,decimal_places=1)

2、 配置settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',      
    'app01.apps.App01Config',  # django2.x+版本    
    # 'app01',  # django1.x版本]

DATABASES = {         # 删除\注释掉原来的DATABASES配置项,新增下述配置
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 使用mysql数据库
        'NAME': 'db1',          # 要连接的数据库
        'USER': 'root',         # 链接数据库的用于名
        'PASSWORD': '',         # 链接数据库的用于名                  
        'HOST': '127.0.0.1',    # mysql服务监听的ip  
        'PORT': 3306,           # mysql服务监听的端口  
        'ATOMIC_REQUEST': True, #设置为True代表同一个http请求所对应的所有sql都放在一个事务中

3.配置日志:如果想打印orm转换过程中的sql,需要在settings中进行配置日志

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

4、数据库迁移命令

python manage.py makemigrations
python manage.py migrate

 模型层models:表查询

 模型层的表查询:跟数据库打交道的

1、单表查询:

        insert update delete all filter

2、常见的查询方法:

单表操作:     
    1、all()      查询所有数据,索引取值    
    2、filter()   过滤条件查询     
    3、get()      查询数据,查询数据为空的情况直接报错     
    4、last()     取所有数据的最后一条     
    5、values( id,username,password )   取值,列表套字典[{'id':1,'username':...},{...}]     
    6、vallues_list()                   取值,列表套元组,都支持for循环     
    7、pring(res.quert)   查看内部的SQL语句,只有防御的结果是queryset对象的时候才能查看     
    8、distinct()         去重     
    9、order_by( 'id' )   默认情况升序排序;('-id')倒序     
    10、reverse()         翻转     
    11、count()           统计当前表中数据的个数     
    12、exclude(pk=1)     排除在外     
    13、exists()          看数据到底有没有

3、基于双下划线的查询:

res = models.UserInfo.object.filter(age_gt=38).all()
age__gt=1---大于
age__lt=1---小于
age__gte=1---大于等于
age__lte=1---小于等于
ageage__in=[18,40]  年龄在十八或40的,或
age__range=[18,40]  年龄在十八到40的,之间

 # 包含s的数据,模糊查询:   

包含s的数据,模糊查询:
    # select * from userinfor where name like '%s%',
    res = models.UserInfo.object.filter(username__contains='s').all()
    print(res)
    print(res.query)
username__icontains--忽略大小写
username__startswith=='o'--以o开头的
username__endswith=='o'--以o结尾的

# 日期查询:

register_time = models.DateTimeField(auto_now=True,auto_now_add=True,null=True)
auto_now: 修改的时间
auto_now_add: 刚加进去时间
查询时间:查2020年1月份的
filter(register_time__year='2020',register_time__month='01).all()

多表查询(跨表查询)

子查询:分步查询
链表查询:把多个有关系的表拼接成一个大表(虚拟表)
            inner join 
            left join
            right join

基于双下划线的查询

年龄大于35岁的数据:

        res = models.User.objects.filter(age__gt=35)

年龄小于35岁的数据:

        res = models.User.objects.filter(age__lt=35)

大于等于 小于等于:

        res = models.User.objects.filter(age__gte=32)

        res = models.User.objects.filter(age__lte=32)

年龄是18 或者 32 或者40:

        res = models.User.objects.filter(age__in=[18,32,40])

年龄在18到40岁之间的  首尾都要:

        res = models.User.objects.filter(age__range=[18,40])

查询出名字里面含有s的数据  模糊查询:

        res = models.User.objects.filter(name__contains='s')

是否区分大小写  查询出名字里面含有p的数据  区分大小写:

        res = models.User.objects.filter(name__contains='p')

忽略大小写:

        res = models.User.objects.filter(name__icontains='p')

以 'j' 开头或以 'j' 结尾:

       res = models.User.objects.filter(name__startswith='j')
       res1 = models.User.objects.filter(name__endswith='j')

查询出注册时间是 2020 1月:

        res = models.User.objects.filter(register_time__month='1')

        res = models.User.objects.filter(register_time__year='2020')

多表查询前期表准备

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)

    # 一对多
    publish = models.ForeignKey(to='Publish')
    # 多对多
    authors = models.ManyToManyField(to='Author')

class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
 # varchar(254)  该字段类型不是给models看的 而是给后面我们会学到的校验性组件看的
    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 一对一
    author_detail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()  # 电话号码用BigIntegerField或者直接用CharField
    addr = models.CharField(max_length=64)

一对多外键增删改查

# 增:

方式一:直接写实际字段 id
models.Book.objects.create(title='论语',price=899.23,publish_id=1)
models.Book.objects.create(title='聊斋',price=444.23,publish_id=2)
models.Book.objects.create(title='老子',price=333.66,publish_id=1)
方式二:虚拟字段 对象
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='红楼梦',price=666.23,publish=publish_obj)

# 删:  models.Publish.objects.filter(pk=1).delete()  # 级联删除

# 修改

models.Book.objects.filter(pk=1).update(publish_id=2)
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)

多对多外键增删改查

# 增,给书籍添加作者:

book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.authors)  # 就类似于你已经到了第三张关系表了
book_obj.authors.add(1)  # 书籍id为1的书籍绑定一个主键为1 的作者
book_obj.authors.add(2,3)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
author_obj2 = models.Author.objects.filter(pk=3).first()
book_obj.authors.add(author_obj)
"""add给第三张关系表添加数据,括号内既可以传数字也可以传对象 并且都支持多个"""

# 删:

book_obj.authors.remove(2)
book_obj.authors.remove(1,3)

author_obj = models.Author.objects.filter(pk=2).first()
author_obj1 = models.Author.objects.filter(pk=3).first()
book_obj.authors.remove(author_obj,author_obj1)
"""remove,括号内既可以传数字也可以传对象 并且都支持多个"""

# 修改:

book_obj.authors.set([1,2])  # 括号内必须给一个可迭代对象
book_obj.authors.set([3])  # 括号内必须给一个可迭代对象

author_obj = models.Author.objects.filter(pk=2).first()
author_obj1 = models.Author.objects.filter(pk=3).first()
book_obj.authors.set([author_obj,author_obj1])  # 括号内必须给一个可迭代对象

# 清空,在第三张关系表中清空某个书籍与作者的绑定关系

        book_obj.authors.clear() 

  clear括号内不要加任何参数

正反向的概念

正向:外键字段在我手上那么,我查你就是正向,按 外键字段
反向:外键字段如果不在手上,我查你就是反向,按 表名小写
          book >>>外键字段在书那儿(正向)>>> publish
          publish    >>>外键字段在书那儿(反向)>>>book
 _set

多表查询之子查询

子查询---基于对象的跨表查询

1.查询书籍主键为1的出版社:

book_obj = models.Book.objects.filter(pk=1).first() # 书查出版社 正向
res = book_obj.publish
print(res)
print(res.name)
print(res.addr)

2.查询书籍主键为2的作者:

book_obj = models.Book.objects.filter(pk=2).first()   # 书查作者 正向
res = book_obj.authors   # app01.Author.None
res = book_obj.authors.all()   # 查的多的话要用all()
print(res)

3.查询作者jason的电话号码:

author_obj = models.Author.objects.filter(name='jason').first()
res = author_obj.author_detail
print(res)
print(res.phone)
print(res.addr)

4.查询出版社是东方出版社出版的书:

publish_obj = models.Publish.objects.filter(name='东方出版社').first()  # 出版社查书  反向
res = publish_obj.book_set    # app01.Book.None
res = publish_obj.book_set.all()
print(res)

5.查询作者是jason写过的书:

author_obj = models.Author.objects.filter(name='jason').first() # 作者查书 反向
res = author_obj.book_set  # app01.Book.None
res = author_obj.book_set.all()
print(res)

6.查询手机号是110的作者姓名:

author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
res = author_detail_obj.author
print(res.name)

# 如果是一个则直接拿到数据对象
            book_obj.publish
            book_obj.authors.all()
            author_obj.author_detail

# 在书写orm语句的时候跟写sql语句一样的,不要企图一次性将orm语句写完 如果比较复杂 就写一点看一点

# 基于对象 : 反向查询的时候
        当你的查询结果可以有多个的时候 就必须加_set.all()
        当你的结果只有一个的时候 不需要加_set.all()

多表查询之联表查询

联表查询---基于双下划线的跨表查询

1.查询jason的手机号和作者姓名:

res = models.Author.objects.filter(name='jason').values('author_detail__phone','name')
print(res)
# 反向
res = models.AuthorDetail.objects.filter(author__name='jason')  # 拿作者姓名是jason的作者详情
res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__name')
print(res)

2.查询书籍主键为1的出版社名称和书的名称:

res = models.Book.objects.filter(pk=1).values('title','publish__name')
print(res)
# 反向
res = models.Publish.objects.filter(book__id=1).values('name','book__title')
print(res)

3.查询书籍主键为1的作者姓名:

res = models.Book.objects.filter(pk=1).values('authors__name')
print(res)
# 反向
res = models.Author.objects.filter(book__id=1).values('name')
print(res)

4.查询书籍主键是1的作者的手机号:

book author authordetail
res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
print(res)

# 你只要掌握了正反向的概念以及双下划线,那么你就可以无限制的跨表

多表查询之分组查询

select age from t group by age;
"""
    MySQL分组查询都有哪些特点
        分组之后默认只能获取到分组的依据 组内其他字段都无法直接获取了
            严格模式
                ONLY_FULL_GROUP_BY
            set global sql_mode='ONLY_FULL_GROUP_BY'
"""

# 你们的机器上如果出现分组查询报错的情况,你需要修改数据库严格模式

# 分组查询  annotate

from django.db.models import Max, Min, Sum, Count, Avg

1.统计每一本书的作者个数:

res = models.Book.objects.annotate()  # models后面点什么 就是按什么分组
res = models.Book.objects.annotate(author_num=Count('authors')).values('title','author_num')
res1 = models.Book.objects.annotate(author_num=Count('authors__id')).values('title','author_num')
print(res,res1)
"""author_num是我们自己定义的字段 用来存储统计出来的每本书对应的作者个数"""

2.统计每个出版社卖的最便宜的书的价格:

res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')
print(res)

3.统计不止一个作者的图书:
        # 先按照图书分组 求每一本书对应的作者个数
        # 过滤出不止一个作者的图书

res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('title','author_num')
print(res)

4.查询每个作者出的书的总价格:

res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')
print(res)

# 代码没有补全 不要怕,正常写,补全给你是pycharm给你的,到后面在服务器上直接书写代码,什么补全都没有,颜色提示也没有
# 只要你的orm语句得出的结果还是一个queryset对象,那么它就可以继续无限制的点queryset对象封装的方法

F查询

F查询:能够帮助你直接获取到表中某个字段对应的数据

1.查询卖出数大于库存数的书籍:

from django.db.models import F
res = models.Book.objects.filter(maichu__gt=F('kucun'))
print(res)

2.将所有书籍的价格提升500块:
        models.Book.objects.update(price=F('price') + 500)

3.将所有书的名称后面加上爆款两个字:

from django.db.models.functions import Concat  #拼接字符串
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'), Value('爆款')))
# models.Book.objects.update(title=F('title') + '爆款')  # 所有的名称会全部变成空白
"""在操作字符类型的数据的时候 F不能够直接做到字符串的拼接"""

Q查询

1.查询卖出数大于100或者价格小于600的书籍:

res = models.Book.objects.filter(maichu__gt=100,price__lt=600)
"""filter括号内多个参数是and关系"""
from django.db.models import Q
# res = models.Book.objects.filter(Q(maichu__gt=100),Q(price__lt=600)) #Q逗号分割还是and关系
res = models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=600))  # | or关系
# res = models.Book.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600))  # ~ not关系
print(res)  # <QuerySet []>

2、Q的高阶用法  能够将查询条件的左边也变成字符串的形式

q = Q()
q.connector = 'or'
q.children.append(('maichu__gt',100))
q.children.append(('price__lt',600))
res = models.Book.objects.filter(q)  # 默认还是and关系
print(res)

 查看内部sql语句的方式

方式1:queryset对象才能够点击query查看内部的sql语句

res = models.User.objects.values_list('name','age')  
# <QuerySet [('jason', 18), ('egonPPP', 84)]>
print(res.query)

方式2:所有的sql语句都能查看

# uptade等等没有queryset对象的只需设置配置文件setting

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

今日思维导图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1232637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TensorFlow实战教程(二十六)-什么是生成对抗网络GAN?基础原理和代码普及

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了Keras实现经典的深度学习文本分类算法,包括LSTM、BiLSTM、BiLSTM+Attention和CNN、TextCNN。这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、…

【Unity细节】如何调节标签图标的大小(select icon)—标签图标太大遮住了物体

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

Qt 基于海康相机的视频绘图

需求 在视频窗口上进行绘图&#xff0c;包括圆&#xff0c;矩形&#xff0c;扇形等 效果&#xff1a; 思路&#xff1a; 自己取图然后转成QImage &#xff0c;再向QWidget 进行渲染&#xff0c;根据以往的经验&#xff0c;无法达到很高的帧率。因此决定使用相机SDK自带的渲染…

利用 React 和 Bootstrap 进行强大的前端开发

文章目录 介绍React 和 Bootstrap设置环境使用 Bootstrap 创建 React 组件React-Bootstrap 组件结论 介绍 创建响应式、交互式和外观引人入胜的 Web 界面是现代前端开发人员的基本技能。幸运的是&#xff0c;借助 React 和 Bootstrap 等工具的出现&#xff0c;制作这些 UI 变得…

目标分割技术-语义分割总览

前言 博主现任高级人工智能工程师&#xff0c;曾发表多篇SCI且获得过多次国际竞赛奖项&#xff0c;理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型&#xff0c;每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一…

Simulia 2022 新功能

增材制造 达索系统增材制造解决方案实现了端到端一体化全流程解决方案&#xff0c;可以实现从原材料研究到创成式设计、工艺设计、工艺仿真仿真、并且还延续到增材制造完成后的热处理、线切割等工艺&#xff0c;涵盖了各个方面的内容。 达索系统针对增材制造各个环节在每一个…

python数据结构与算法-06_算法分析

算法复杂度分析 前面我们说了很多次时间复杂度是 O(1), O(n) 啥的&#xff0c;并没有仔细讲解这个 O 符号究竟是什么。 你可以大概理解为操作的次数和数据个数的比例关系。比如 O(1) 就是有限次数操作&#xff0c;O(n) 就是操作正比于你的元素个数。 这一章我们用更严谨的方式…

以makefile的方式在linux上编译代码(小白级别)

作者&#xff1a;爱塔居 作者简介&#xff1a;大四学生&#xff0c;分享自己的学习片段~ 目录 前言 一、创建主要文件 二、makefile 前言 多有不足&#xff0c;以供参考&#xff0c;欢迎大佬们指点。我是在虚拟机上执行的&#xff0c;应该都一样。我用的VirtualBox&#xff0c;…

PHP/Lerv通过经纬度计算距离获取附近商家

实际开发中,常常需要获取用户附近的商家,思路是 获取用户位置(经纬度信息)在数据库中查询在距离范围内的商家 注: 本文章内计算距离所使用地球半径统一为 6378.138 km public function mpa_list($latitude,$longitude,$distance){// $latitude 34.306465;// $longitude 10…

Redis篇---第十一篇

系列文章目录 文章目录 系列文章目录前言一、说说Redis持久化机制二、缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题三、热点数据和冷数据是什么前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

Android WMS——输入系统管理(十七)

一、简介 1、工作原理 输入子系统从驱动文件中读取事件后,再封装提交给 IMS,IMS 再发送给 WMS 进行处理。 Android 输入系统的工作原理概括来说,内核将原始事件写入到设备节点中,InputReader 不断地通过 EventHub 将原始事件取出来并翻译加工成 Android 输入事件,…

抖音电商双11官方数据最全汇总!

11月13日&#xff0c;抖音电商数据发布“抖音商城双11好物节”数据报告&#xff0c;展现双11期间平台全域经营情况及大众消费趋势。 报告显示&#xff0c;10月20日至11月11日&#xff0c;抖音电商里的直播间累计直播时长达到5827万小时&#xff0c;挂购物车的短视频播放了1697亿…

引入 requests.codes 模块

在网络应用开发中&#xff0c;处理HTTP请求状态码是一项常见的任务。然而&#xff0c;使用Python的requests库时&#xff0c;我们会发现一个不便之处&#xff1a;requests库没有提供一个方便的方式来管理和引用HTTP请求状态码。 在使用requests库进行HTTP请求时&#xff0c;我…

jenkins传参给robotframework

在做自动化的时候&#xff0c;需要使用jenkins传参给rf&#xff0c;rf根据传来的变量运行&#xff0c;在将变量传递给py脚本文件。特此记录。 一、配置jenkins 构建的命令使用如下格式即可&#xff08;注意空格&#xff09;&#xff1a; cd D:\xxx\test call pybot --variabl…

【数据结构】【版本2.0】【树形深渊】——二叉树入侵

目录 引言 一、树的概念与结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用 二、二叉树的概念与结构 2.1 二叉树的概念 2.2 特殊二叉树 满二叉树 完全二叉树 2.3 现实中的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 顺序存储 链式…

这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!

目录 一.数据库导出 1.首先创建文件以.sql结尾的文件 2.打开名mysq的解压目录&#xff0c;导出数据 3.然后在查看即可 4 需要的软件 MobaXterm 一.数据库导出 1.首先创建文件以.sql结尾的文件 通过 touch ssm.sql &#xff08;小编&#xff09; 实际上&#xff1a…

提升办公效率,畅享多功能办公笔记软件Notion for Mac

在现代办公环境中&#xff0c;高效的笔记软件对于提高工作效率至关重要。而Notion for Mac作为一款全能的办公笔记软件&#xff0c;将成为你事业成功的得力助手。 Notion for Mac以其多功能和灵活性而脱颖而出。无论你是需要记录会议笔记、管理项目任务、制定流程指南&#xf…

光谱图像超分辨率综述

光谱图像超分辨率综述 简介 ​ 论文链接&#xff1a;A Review of Hyperspectral Image Super-Resolution Based on Deep Learning UpSample网络框架 1.Front-end Upsampling ​ 在Front-end上采样中&#xff0c;是首先扩大LR图像&#xff0c;然后通过卷积网络对放大图像进行…

Linux安装rabbitMq(亲测可用)解决只能本地访问的问题

安装er https://blog.csdn.net/laterstage/article/details/131513793?spm1001.2014.3001.5501下载mq wget --content-disposition "https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm?distro_v…

阿里云4核8G服务器优惠价格表,最低价格501.90元6个月、983.80元1年

阿里云4核8G服务器优惠价格表&#xff0c;云服务器ECS计算型c7实例4核8G配置3M带宽40GB ESSD云盘&#xff08;系统盘&#xff09;叠加使用优惠券后价格501.90元6个月、983.80元1年&#xff0c;现在购买经济型e、通用算力型u1、计算型c7和计算型c8a与c8i实例4核8G配置均有优惠&a…