SQLAlchemy的查询过滤filter_by和filter

news/2024/4/28 14:03:31/文章来源:https://blog.csdn.net/book_dw5189/article/details/137129023

要执行范围查询或模糊查询,可使用 SQLAlchemy 提供的运算符和函数来构建更复杂的过滤条件。下面是一些示例:

1. **范围查询(Range Query)**:可以使用 `between` 运算符来查询某个范围内的记录。

from sqlalchemy import between# 查询年龄在 25 到 35 之间的记录
records = session.query(MyTable).filter(MyTable.age.between(25, 35)).all()

2. **模糊查询(Like Query)**:可以使用 `like` 函数进行模糊查询,使用 `%` 表示通配符。

from sqlalchemy import like# 查询姓名以 'J' 开头的记录
records = session.query(MyTable).filter(MyTable.name.like('J%')).all()# 查询姓名包含 'oh' 的记录
records = session.query(MyTable).filter(MyTable.name.like('%oh%')).all()

3. **逻辑运算符(Logical Operators)**:可以使用 `and_`、`or_` 和 `not_` 运算符组合多个过滤条件。

from sqlalchemy import and_, or_# 查询年龄为 30 并且姓名以 'J' 开头的记录
records = session.query(MyTable).filter(and_(MyTable.age == 30, MyTable.name.like('J%'))).all()# 查询年龄为 25 或者 30 的记录
records = session.query(MyTable).filter(or_(MyTable.age == 25, MyTable.age == 30)).all()
from sqlalchemy import and_, or_, not_# 查询年龄在 25 到 35 之间,并且姓名以 'J' 开头,但排除姓为 'John' 的记录
records = session.query(MyTable).filter(and_(MyTable.age.between(25, 35), MyTable.name.like('J%'), not_(MyTable.name == 'John'))).all()

-----------

在使用SQLAlchemy时,`filter_by`和`filter`是两种常用的方法,用于对查询结果进行过滤。它们之间有一些区别:

1. **filter_by**:
   - `filter_by`方法用于基于指定的关键字参数进行过滤。
   - 它可以更简洁地指定过滤条件,但是无法处理复杂的条件。
   - 通常用于在简单情况下进行过滤,例如对某个特定列进行等值匹配。
   - 返回的结果是基于指定条件过滤后的查询对象。
# 示例:使用 filter_by 进行等值匹配
record = session.query(MyTable).filter_by(name='John').first()

2. **filter**:
   - `filter`方法则更加灵活,可以处理更复杂的条件,包括使用运算符、函数和组合条件。
   - 可以通过`and_`、`or_`和其他逻辑运算符结合多个条件进行查询。
   - 对于复杂的查询需求,通常更适合使用`filter`方法。
   - 返回的结果也是基于指定条件过滤后的查询对象。
# 示例:使用 filter 进行复杂条件查询

records = session.query(MyTable).filter(and_(MyTable.age >= 25, MyTable.age <= 35)).all()

总的来说,`filter_by`适用于简单的等值匹配,而`filter`则更适用于复杂的条件查询。根据具体的情况选择使用哪种方法。

----------

使用SQLAlchemy库进行数据库操作的基本流程通常包括以下步骤:

  1. 创建引擎(Create Engine):首先,创建一个数据库引擎,该引擎将负责与数据库进行通信和交互。引擎可以通过 create_engine() 函数创建,并指定数据库的连接信息,如数据库类型(SQLite、MySQL、PostgreSQL等)和连接字符串。
from sqlalchemy import create_engineengine = create_engine('sqlite:///example.db')  # 创建SQLite数据库引擎
  1. 创建会话(Create Session):然后,创建一个会话,会话负责管理数据库连接和事务。可以使用 sessionmaker() 函数创建会话类,并绑定到先前创建的引擎上。
from sqlalchemy.orm import sessionmakerSession = sessionmaker(bind=engine)  # 创建一个会话类
session = Session()  # 创建一个会话实例
  1. 定义映射类(Define Mapping Classes):接下来,定义映射类,这些类将数据库中的表映射到Python对象。通常,每个表都对应一个映射类,并使用 declarative_base() 函数创建基类。
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, StringBase = declarative_base()class MyTable(Base):__tablename__ = 'my_table'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)
  1. 执行数据库操作(Perform Database Operations):使用会话执行各种数据库操作,如添加、查询、更新和删除记录等。
# 添加记录
new_record = MyTable(name='John', age=30)
session.add(new_record)
session.commit()  # 提交事务# 查询记录
records = session.query(MyTable).filter_by(age=30).all()for record in records:print(record.name, record.age)# 更新记录
record_to_update = session.query(MyTable).filter_by(name='John').first()
record_to_update.age = 35
session.commit()  # 提交事务# 删除记录
record_to_delete = session.query(MyTable).filter_by(name='John').first()
session.delete(record_to_delete)
session.commit()  # 提交事务
  1. 关闭会话(Close Session):最后,结束数据库操作时关闭会话,释放资源。
session.close()

这些是使用SQLAlchemy进行数据库操作的基本步骤。

 --------------------

func 是 SQLAlchemy 提供的一个模块,用于在查询中使用 SQL 函数。它允许你在查询中使用各种 SQL 函数,如 COUNT()SUM()MAX()MIN() 等,以及数据库特定的函数,如 UPPER()(将字符串转换为大写)、LOWER()(将字符串转换为小写)等。

这个模块的使用通常是在查询的过程中,可在查询语句中使用 func 来调用各种函数,从而在数据库层面执行相应的操作。

以下是一个简单的示例,演示如何在查询中使用 func

from sqlalchemy import create_engine, func
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String# 创建数据库引擎
engine = create_engine('sqlite:///example.db')# 创建一个基类
Base = declarative_base()# 定义ORM映射类
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建一个Session类工厂函数
Session = sessionmaker(bind=engine)# 使用Session类创建一个数据库会话
session = Session()# 查询用户表中的记录数量
user_count = session.query(func.count(User.id)).scalar()
print("Total users:", user_count)# 查询用户表中年龄的平均值
average_age = session.query(func.avg(User.age)).scalar()
print("Average age of users:", average_age)# 查询用户表中年龄的最大值
max_age = session.query(func.max(User.age)).scalar()
print("Maximum age of users:", max_age)# 现在可以使用session来执行数据库操作

在上面的示例中,我们使用了 func.count()func.avg() 和 func.max() 来分别计算用户记录的数量、年龄的平均值和最大年龄。

 

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

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

相关文章

uniApp使用XR-Frame创建3D场景(8)粒子系统

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 本片我们详细讲解一下xr-frame的粒子系统 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{{sec8}}"><xr-asset-load t…

小程序利用WebService跟asp.net交互过程发现的问题并处理

最近在研究一个项目&#xff0c;用到asp.net跟小程序交互&#xff0c;简单的说就是小程序端利用wx.request发起请求。获取asp.net 响应回来的数据。但经常会报错。点击下图的测试按钮 出现如下错误&#xff1a; 百思不得其解&#xff0c;试了若干方法&#xff0c;都不行。 因为…

京东云搭建幻兽帕鲁Palworld多人游戏联机服务器教程,1分钟开服

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程&#xff0c;非常简单&#xff0c;京东云推出幻兽帕鲁镜像系统&#xff0c;镜像直接选择幻兽帕鲁镜像即可一键自动部署&#xff0c;不需要手动操作&#xff0c;真正的新手0基础部署幻兽帕鲁&#xff0c;阿腾云atengyun.…

Machine Learning机器学习之统计分析

目录 前言 机器学习之统计分析 统计学的主要目标包括&#xff1a; 统计学核心概念&#xff1a; 统计基础&#xff1a; 训练误差&#xff1a; 常见的损失函数&#xff1a; 正则化和交叉验证 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉…

网络工程师之路由交换技术篇

网络工程师之路由交换技术篇 路由交换之技术篇ARPICMPBPDUIPv6IP编址MAC其他技术点参考 以下均为个人笔记&#xff0c;摘录到csdn做备份 路由交换之技术篇 ARP Operation Code指定了ARP报文的类型&#xff0c; 包括ARP request 和ARP reply&#xff1b;取值为1或者2 &#x…

uniapp输入框事件(防抖)

一、描述 在输入框输入内容或者说输入关键词的时候&#xff0c;往往都要进行做防抖处理。如果不做防抖&#xff0c;你输入什么&#xff0c;动态绑定的数据就会保持一致。这样不好吗&#xff0c;同步获取。有个业务场景&#xff0c;如果是搜索框&#xff0c;你每次一个字符&…

Java中读取html文件转成String,展示在浏览器

这里写目录标题 第一章1.1&#xff09;pom中引入依赖和html文件示例1.2&#xff09;使用hutool工具包读取html文件转为string1.3&#xff09;页面显示 第一章 1.1&#xff09;pom中引入依赖和html文件示例 引入hutool工具包依赖 <dependency><groupId>cn.hutool&…

【Linux】 gcc(linux下的编译器)程序的编译和链接详解

目录 前言&#xff1a;快速认识gcc 1. 程序的翻译环境和执行环境 2.编译和链接 2.1翻译环境 2.2编译环境 1. 预处理 gcc -E指令 test.c&#xff08;源文件&#xff09; -o test.i&#xff08;生成在一个文件中&#xff0c;可以自己指定&#xff09; 预处理完成之后就停下来&am…

贪心算法--最大数

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接https://leetcode.cn/problems/largest-number/description/ class Solution { public:bool static compare(int a, int b){return (to_string(a) to_string(b)) > (to_string(b) to_string(a));}bool operato…

MySQL创建表:练习题

练习题&#xff1a; 创建一个名为"students"的数据库&#xff0c;并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表&#xff0c;包含以下字段&#xff1a; id: 整数类型 name: 字符串类型&#xff0c;学生姓名 subject: 字符串…

最小可行产品需要最小可行架构——可持续架构(三)

前言 最小可行产品&#xff08;MVP&#xff09;的概念可以帮助团队专注于尽快交付他们认为对客户最有价值的东西&#xff0c;以便在投入大量时间和资源之前迅速、廉价地评估产品的市场规模。MVP不仅需要考虑产品的市场可行性&#xff0c;还需要考虑其技术可行性&#xff0c;以…

计算机专业学习单片机有什么意义吗?

玩单片机跟玩计算机区别还是很大的, 单片机有众多的种类,每一种又可能有很多个系列.可以说单片机就是为了专款专用而生的.这样来达到产品成本的降低,这就是现在身边的很多的电子产品价格一降再降的原因之一.在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一…

安装paddle detection心得

一、安装PaddlePaddle conda create -n mypaddle python3.8 conda activate mypaddle python -m pip install paddlepaddle-gpu2.6.0 -i https://mirror.baidu.com/pypi/simple 请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。 这是CUDA1…

SpringBoot项目启动成功,但是调用接口直接报NOT FOUND 404

问题描述 SpringBoot项目启动成功&#xff0c;但是调用接口直接报NOT FOUND 404 解决办法 启动类中ComponentScan(basePackages {“com.afclab”})中的扫包路径和项目路径不一样&#xff0c;导致扫不到Controller等组件&#xff0c;修改成和项目路径一样就可以解决&#xf…

8、鸿蒙学习-HAR

HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上。只能作为应用模块的依赖项被引用。 一、创建…

206基于matlab的无人机航迹规划(UAV track plannin)

基于matlab的无人机航迹规划(UAV track plannin&#xff09;。输入输出参数包括 横滚、俯仰、航向角&#xff08;单位&#xff1a;度&#xff09;&#xff1b;横滚速率、俯仰速率、航向角速率&#xff08;单位&#xff1a;度/秒&#xff09;&#xff1b;飞机运动速度——X右翼、…

小美的平衡矩阵(前缀和例题)

2024美团秋招&#xff0c;被这一题给难住了 美团校招笔试真题_Java工程师、C工程师_牛客网 题目&#xff1a; 解答&#xff1a; 这道题的关键点就是要计算出以某一点为矩阵右下角时&#xff0c;1的个数 我一开始是想着遍历&#xff0c;以某一点为起点&#xff08;矩阵左上角&a…

Github万星项目lobe-chat,连接GPT4GPTs,平替chatgpt-plus

简介 Lobe Chat - 一个开源、高性能的聊天机器人框架&#xff0c;支持语音合成、多模态和可扩展的函数调用插件系统。支持一键免费部署您的私人 ChatGPT/LLM Web 应用程序。 项目地址&#xff1a; GitHub - lobehub/lobe-chat: &#x1f92f; Lobe Chat - an open-source, mo…

稀碎从零算法笔记Day32-LeetCode:每日温度

算是引出“单调栈”这种数据结构&#xff0c;后面会用这个思想处理下接雨水问题 前言&#xff1a;单调栈模式匹配——题目中提到“求第一个最大/最小的元素” 题型&#xff1a;栈、单调栈、数组 链接&#xff1a;739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 来源…

Eclipse+Java+Swing实现斗地主游戏

一. 视频演示效果 java斗地主源码演示 ​ 二.项目结构 代码十分简洁&#xff0c;只有简单的7个类&#xff0c;实现了人机对战 素材为若干的gif图片 三.项目实现 启动类为Main类&#xff0c;继承之JFrame&#xff0c;JFrame 是 Java Swing 库中的一个类&#xff0c;用于创建窗…