SQLAlchemy的查询过滤filter_by和filter

要执行范围查询或模糊查询,可使用 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_engine

engine = create_engine('sqlite:///example.db')  # 创建SQLite数据库引擎
  1. 创建会话(Create Session):然后,创建一个会话,会话负责管理数据库连接和事务。可以使用 sessionmaker() 函数创建会话类,并绑定到先前创建的引擎上。
from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)  # 创建一个会话类
session = Session()  # 创建一个会话实例
  1. 定义映射类(Define Mapping Classes):接下来,定义映射类,这些类将数据库中的表映射到Python对象。通常,每个表都对应一个映射类,并使用 declarative_base() 函数创建基类。
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String

Base = 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.mfbz.cn/a/497610.html

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

相关文章

网络:udptcp套接字

目录 协议 网络传输基本流程 网络编程套接字 udp套接字编程 udp相关代码实现 sock函数 bind函数 recvfrom函数 sendto函数 udp执行指令代码 popen函数 udp多线程版收发消息 tcp套接字编程 tcp套接字代码 listen函数 accept函数 read/write函数 connect函数 recv/…

第二十一章 Jquery ajax

文章目录 1. jquery下载2. jquery的使用3. jquery页面加载完毕执行4. jquery属性控制6. 遍历器 2. ajax1. 准备后台服务器2. ajax发送get请求3. ajax发送post请求 1. jquery下载 点击下载 稳定版本1.9 2. jquery的使用 存放到html文件的同级目录 3. jquery页面加载完毕执行…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…

HarmonyOS 应用开发之UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

React 应用实现监控可观测性最佳实践

前言 React 是一个用于构建用户界面的 JavaScript 框架。它采用了虚拟 DOM 和 JSX&#xff0c;提供了一种声明式的、组件化的编程模型&#xff0c;以便更高效地构建用户界面。无论是简单还是复杂的界面&#xff0c;React 都可以胜任。 YApi 是使用 React 编写的高效、易用、功…

报表生成器FastReport .Net用户指南:脚本示例

FastReport的报表生成器&#xff08;无论VCL平台还是.NET平台&#xff09;&#xff0c;跨平台的多语言脚本引擎FastScript&#xff0c;桌面OLAP FastCube&#xff0c;如今都被世界各地的开发者所认可&#xff0c;这些名字被等价于“速度”、“可靠”和“品质”,在美国&#xff…

[Flutter]环境判断

方式一&#xff08;推荐&#xff09; 常量kReleaseMode&#xff0c;它会根据你的应用是以什么模式编译的来获取值。bool.fromEnvironment会从Dart编译时的环境变量中获取值。对于dart.vm.product这个特定的环境变量&#xff0c;它是由Dart VM设置的&#xff0c;用来标明当前是…

基于PaddleNLP的深度学习对文本自动添加标点符号(二)

前言 基于PaddleNLP的深度学习对文本自动添加标点符号的源码版来了&#xff0c;本篇文章主要讲解如何文本自动添加标点符号的原理和相关训练方法&#xff0c;前一篇文章讲解的是使用paddlepaddle已经训练好的一些模型&#xff0c;在一些简单场景下可以通过这些模型进行预测&…

华为防火墙配置指引超详细(包含安全配置部分)以USG6320为例

华为防火墙USG6320 华为防火墙USG6320是一款高性能、高可靠的下一代防火墙,适用于中小型企业、分支机构等场景。该防火墙支持多种安全功能,可以有效抵御网络攻击,保护网络安全。 目录 华为防火墙USG6320 1. 初始配置 2. 安全策略配置 3. 防火墙功能配置 4. 高可用性配…

Git,GitHub,Gitee,GitLab 四者有什么区别?

目录 1. Git 2. GitHub 3. Gitee 4. GitLab 5. 总结概括 1. Git Git 是一个版本管理工具&#xff0c;常应用于本地代码的管理&#xff0c;下载完毕之后&#xff0c;我们可以使用此工具对本地的资料&#xff0c;代码进行版本管理。 下载链接&#xff1a; Git - Downlo…

前端项目在本地localhost可以调取到拍照或麦克风等设备,但是在局域网内IP+端口号访问项目时访问不到设备

前端项目在本地localhost可以调取到拍照或麦克风等设备&#xff0c;但是在局域网内IP端口号访问项目时访问不到设备&#xff0c;调取navigation.mediaDevices时本科可以获取到mediaDevices列表&#xff0c;局域网内ip端口访问时获取不到mediaDevices。 原因&#xff1a; 存在…

vector类(二)

文章目录 vector类的模拟实现1.默认成员变量和函数2.迭代器函数3.空间容量和长度4.[ ]下标调用5.插入操作&#xff08;尾插&#xff09;6.调整容量大小7.判空操作8.删除操作9.插入操作10.size空间大小11.消除操作 vector类的模拟实现 1.默认成员变量和函数 首先自定义构造vec…

uni-app(自定义题色变量)

1.安装sass npm i sass -D 2.安装sass-loader npm i sass-loader10.1.1 -D 3.创建自定义文件 在根目录static目录下&#xff0c;创建scss->_them.scss&#xff0c;目录名称及文件名称自定义即可。 4.定义颜色变量 在_them.scss中&#xff0c;自定义颜色变量&#xff0…

纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图

系统买的是商业版&#xff0c;使用非常不错有三端uniapp开源代码&#xff0c;自从上次分享uniapp后有些网友让我分享下各个端的uniapp下的各个目录结构说明 我就截图说以下吧&#xff0c;

鸿蒙OS开发实例:【Web网页】

背景 HarmonyOS平台通过Web控件可支持网页加载展示&#xff0c;Web在中是作为专项参考的。 本篇文章将从Android和iOS平台研发角度出发来实践学习API功能 说明 整个示例是以HarmonyOS开发文档网址作为加载目标页面布局增加了三个按钮“后退”&#xff0c;“前进”&#xff…

Redis、Mysql双写情况下,如何保证数据一致

Redis、Mysql双写情况下&#xff0c;如何保证数据一致 场景谈谈数据一致性三个经典的缓存模式Cache-Aside Pattern读流程写流程 Read-Through/Write-Through&#xff08;读写穿透&#xff09;Write behind &#xff08;异步缓存写入&#xff09; 操作缓存的时候&#xff0c;删除…

Solidity Uniswap V2 Router swapTokensForExactTokens

最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法

联想 lenovoTab 拯救者平板 Y700 二代_TB320FC原厂ZUI_15.0.677 firmware 线刷包9008固件ROM root方法 ro.vendor.config.lgsi.market_name拯救者平板 Y700 ro.vendor.config.lgsi.en.market_nameLegion Tab Y700 #ro.vendor.config.lgsi.short_market_name联想平板 ZUI T # B…

JMM Java内存模型

JMM本身是一个抽象的概念,不是真实存在的,它仅仅是一种规定或者说是规范 1.用来实现线程和主内存直接的抽象关系 2.屏蔽各个硬件平台和操作系统的内存访问差异,使得java程序在各种平台都能达到一致的内存访问效果 JMM的三大特性 可见性 多线程环境下,某个线程修改了变量…
最新文章