sqlalchemy查询数据为空,查询范围对应的数据在数据库真实存在

记录一个开发过程遇到的小bug,构造些伪数据还原并解释。

"""
场景:传参触发了查询条件,数据库中是存在传参对应范围的数据,但是通过查询条件得到的查询结果为空
"""
入参场景一:
start_time = "2023-11-13"
end_time = "2023-11-13"
入参场景二:
start_time = "2023-11-10"
end_time = "2023-11-15"表字段time 类型定义:
time:datetime
表字段time下的值为:
2023-11-13 00:00:00
2023-11-13 11:00:00
...
查询条件:
query = session.query(model).filter(model.time >= start_time, alarm_model.time <= end_time, model.name.in_(name_list))
使用入参场景一的参数值查询得到的结果就是空
使用入参场景二的参数值就可以查询到2023-11-13对应的值

原因分析说明:

time 字段类型和入参参数类型不同,其中 filter(model.time >= start_time, alarm_model.time <= end_time) 这里的条件,转换成SQL就是
WHERE time >= ‘2023-11-13’ AND time <= ‘2023-11-13’。
这样就是在和 time这个时间字段做直接字符串比较,所以 ‘2023-11-13’ 不能匹配 '2023-11-13 16:02:36’格式的时间。

解决方案,找两种分析

方案一:使用完整的时间字符串,而不是只用日期,这样会形成一个时间范围,就能和time的时间格式匹配

WHERE time >= '2023-11-13 00:00:00' AND time <= '2023-11-13 23:59:59'

但是这个方案有一个弊端,需要数据库扫描整个时间范围内的time值,如果这一天的数据量很大,查询会比较慢。

方案二:使用日期函数提取日期部分,只需要对比日期部分,跳过时间部分的比较利用索引,查询效率会更高。

import sqlalchemy as sa
或者
from sqlalchemy import funcquery = session.query(model).filter(sa.func.date(model.time) == start_date,model.time <= end_time, model.name.in_(name_list))
)
或者
query = session.query(model).filter(func.date(model.time) == start_date,model.time <= end_time, model.name.in_(name_list))
)
区别主要在于:方式1 通过sqlalchemy模块名作为前缀,定义别名,访问func子模块,避免与当前命名空间冲突
方式2 直接导入func到当前命名空间,直接使用

从性能的角度来说,
1,完整时间范围查询会全表扫描指定日期内所有记录, IO和计算量都很大。
2,使用日期函数过滤可以省去时间部分的比对,可以利用索引,查询效率会更高。

具体问题看表和索引情况,但正常情况使用日期函数提取日期部分查询要更优于完整的时间范围查询。

如以下的索引方式

MySQL索引:
名字:idx_alarm
字段:time, name, extend
索引类型:NORMAL
索引方法:BTREE

案例这个idx_alarm是一个普通的多列索引,包含time, name, extend三个字段,使用的是BTREE索引。

WHERE DATE(time) = '2023-11-13'

这个条件就会命中索引。DATE(time) 对字段做了转换,但是不会打破索引关系。WHERE条件使用了time列的计算值进行等值匹配,根据索引最左前缀原则,索引包含查询条件中的列,所以会被用到。

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

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

相关文章

修复img实际有正确的链接,但是不显示 (chrome 插件保存的html)--google镜像chatgpt

打开目标html文件 chrome 控制台 执行以下脚本 //删除侧边栏 $x("//div[idsidebar]")[0].remove();//修复img实际有正确的链接&#xff0c;但是不显示 (chrome 插件保存的html&#xff09; //img.data-savepage-src 复制到 img.src imgs$x("//img"); imgs…

小黑完成了最后一节健身课,顺利完成了跳绳比赛,乘飞机到达南京准备第二天领物资和南京城内闲逛的leetcode之旅:215. 数组中的第K个最大元素

小黑代码 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 数组长度n len(nums)nums list(map(lambda x:-x, nums))q []for i in range(n):heapq.heappush(q, nums[i])# 出堆target -1for i in range(k):target heapq.heappop(q)return -…

Java Web——TomcatWeb服务器

目录 1. 服务器概述 1.1. 服务器硬件 1.2. 服务器软件 2. Web服务器 2.1. Tomcat服务器 2.2. 简单的Web服务器使用 1. 服务器概述 服务器指的是网络环境下为客户机提供某种服务的专用计算机&#xff0c;服务器安装有网络操作系统和各种服务器的应用系统服务器的具有高速…

《向量数据库指南》——2023云栖大会现场,向量数据库Milvus Cloud成关注焦点

近期,广受关注的2023 云栖大会正式收官,来自全球各地的开发者集聚一堂,共同探索 AI 时代的更多可能性。 云栖大会是由阿里巴巴集团主办的科技盛宴,是中国最早的开发者创新展示平台。据悉,今年云栖大会的主题为“计算,为了无法计算的价值”,共吸引了全球 44 个国家和地区…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作&#xff1a;拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件&#xff0c;要setDragEnabled(true) 对于要拖入的窗口或控件&#xff0c;要setAcceptDrops(true) 下面以一个具体的用例进行说…

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中&#xff0c;数据以图的形式表示&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据&#xff0c;如社交网络、推荐系统、网络…

vuekeyclock 集成

前端集成keycloak鉴权的主要写法&#xff0c; 在main.js里面写 import VueKeycloakJs from dsb-norge/vue-keycloak-js import { KeycloakInstance } from "keycloak-js";// 回调地址 const pageIndex process.env.NODE_ENV production ? http://xxxx/#/ : http:…

2023数据结构期中测验-2023秋-计算机+未来网络专业

数据结构期中测验 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 为了防止不自觉的朝答案看去&#xff0c;特意用了浅色字体 选择题 2-1 下述程序段的时间复杂度为&#xff08; &#xff09; for&#xff0…

LightDB23.4 支持双引号+字段名大写兼容oracle数据库

背景介绍 由于Oracle数据库默认是将列名以大写的形式存储的&#xff0c;LightDB数据库默认以小写的形式存储列名&#xff0c;为了兼容Oracle数据库的SQL语句&#xff0c;LightDB23.4版本支持双引号字段名大写来操作以小写形式存储的列名。这个功能仅在Oracle兼容模式下生效&am…

Edge最新版本,关闭侧边栏,不需命令,更改设置就可

边栏展示 说明&#xff1a;Edge自动更新版本后&#xff08;版本 119.0.2151.58&#xff09;&#xff0c;出现了侧边栏&#xff0c;看着很不舒服&#xff0c;效果如上图 修改&#xff1a; 1、在设置找到侧栏 2、点击Copilot后&#xff0c;展示的页面中会有始终显示边栏这一开…

《洛谷深入浅出进阶篇》P3397 地毯————二维差分

上链接&#xff1a;P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3397 上题干&#xff1a; 题目描述 在 nn 的格子上有 m 个地毯。 给出这些地毯的信息&#xff0c;问每个点被多少个地毯覆盖。 输入格式 第一行&#xff0c;两个…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

业务连续性:确保稳健运营的关键战略

在今天的快节奏商业环境中&#xff0c;保障业务连续性是企业成功的重要保障。业务连续性不仅仅是关于应对自然灾害或技术故障&#xff0c;更是一项战略&#xff0c;涉及组织的整体准备、规划和应对能力&#xff0c;以确保在各种情况下业务的稳健运营。 一、业务连续性的定义 业…

常见希腊字母

大写希腊字母 LaTeX表示 A A l p h a B B e t a Γ G a m m a Δ D e l t a E E p s i l o n Z Z e t a H E t a Θ T h e t a I I o t a K K a p p a Λ L a m b d a M M u N N u Ξ X i O O m i c r o n Π P i P R h o Σ S i g m a T T a u Υ U p s i l o n Φ P h i X C …

Docker - 企业项目

Docker - 企业项目 因为环境原因&#xff0c;本章本人没有实际操作&#xff0c;以理论为主 容器单独没有什么意义&#xff0c;有意义的是容器的编排 Docker 4台&#xff1a;1核2G的ECS K8s 9台&#xff1a;2核4G的ECS Docker Compose Docker Swarm # manager节点初始化sw…

【C++11】线程库

文章目录 thread 线程库mutex 锁atomic 原子性操作condition_variable 条件变量实现两个线程交替打印1-100 thread 线程库 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如Windows和Linux下各有自己的接口&#xff0c;这使得代码的可移植…

(Matalb时序预测)GWO-BP灰狼算法优化BP神经网络的多维时序回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分代码展示&#xff1a; 四、完整代码数据说明手册下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于M…

NC65 消息弹框提示和状态栏提示以及其他方式的输出或抛出

弹框提示&#xff1a;nc.ui.pub.beans.MessageDialog 用于显示状态栏提示信息&#xff1a;nc.ui.uif2.ShowStatusBarMsgUtil nc.ui.uif2.DefaultExceptionHanler exceptionHanler new nc.ui.uif2.DefaultExceptionHanler(); exceptionHanler.setContext(ctx); // 重置错误类…

01:2440----点灯大师

目录 一:点亮一个LED 1:原理图 2:寄存器 3:2440的框架和启动过程 A:框架 B:启动过程 4:代码 5:ARM知识补充 6:c语言和汇编的应用 A:代码 B:分析汇编语言 C:内存空间 7:内部机制 二:点亮2个灯 三:流水灯 四:按键控制LED 1:原理图 2:寄存器配置 3:代码 一:点…