SQLAlchemy中filter函数的使用

简介: SQLAlchemy中filter函数的使用

filter过滤数据

在SQLAlchemy中,filter 方法用于在查询中对数据进行过滤,以获取符合特定条件的记录。这方法允许你构建 SQL 查询中的 WHERE 子句,并可以组合多个条件来过滤数据。

方法及使用示例

以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:

基本过滤

使用 filter 方法来获取满足指定条件的记录。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql://user:password@localhost/dbname')
Session = sessionmaker(bind=engine)
session = Session()
# 查询用户名为'John'的用户
results = session.query(User).filter(User.name == 'John').all()

多个条件的过滤

可以组合多个条件来过滤数据,使用 and_ 和 or_ 来构建复杂的条件表达式。

from sqlalchemy import and_, or_
# 查询用户名为'John'且年龄大于等于30的用户
results = session.query(User).filter(and_(User.name == 'John', User.age >= 30)).all()
# 查询用户名为'John'或年龄大于等于30的用户
results = session.query(User).filter(or_(User.name == 'John', User.age >= 30)).all()

模糊查询

使用 like 方法进行模糊查询。

# 查询用户名以'J'开头的用户
results = session.query(User).filter(User.name.like('J%')).all()

IN查询

使用 in_ 方法来查询某个字段是否包含在一组值中。

values = ['John', 'Alice', 'Bob']
results = session.query(User).filter(User.name.in_(values)).all()

空值和非空值

使用 is_ 方法来查询空值或非空值。

# 查询没有邮箱地址的用户
results = session.query(User).filter(User.email.is_(None)).all()
# 查询有邮箱地址的用户
results = session.query(User).filter(User.email.isnot(None)).all()

代码演示

from random import randint
from uuid import uuid4
from sqlalchemy import Column,Integer,String,Float,Text,and_,or_
from db_util import Base,Session
class Article(Base):
  __tablename__ = 't_article'
  id = Column(Integer,primary_key=True,autoincrement=True)
  title = Column(String(50),nullable=False)
  price = Column(Float,nullable=False)
  content = Column(Text)
  def __repr__(self):
    return f"<Article(title:{self.title} price:{self.price} content:{self.content})>"
def create_data():
  with Session() as ses:
    for i in range(10):
      if i%2 == 0:
        art = Article(title = f'title{i+1}',price=randint(1,100),content = uuid4())
      else:
        art = Article(title = f'TITLE{i+1}',price=randint(1,100))
      ses.add(art)
    ses.commit()
def query_data():
  with Session() as ses:
    # rs = ses.query(Article).filter_by(id=1).first()
    rs = ses.query(Article).filter(Article.id == 1).first()
    print(rs)
def query_data_equal():
  with Session() as ses:
    rs = ses.query(Article).filter(Article.title == 'title2').first()
    print(rs)
def query_data_not_equal():
  with Session() as ses:
    rs = ses.query(Article).filter(Article.title != 'title2').all()
    print(rs)
def query_data_like():
  with Session() as ses:
    # select * from t_article where title like 'title%';
    rs = ses.query(Article).filter(Article.title.like('title%')).all()
    for r in rs:
      print(r)
def query_data_in():
  with Session() as ses:
    rs = ses.query(Article).filter(Article.title.in_(['title1','title3','title6'])).all()
    for r in rs:
      print(r)
def query_data_not_in():
  with Session() as ses:
    rs = ses.query(Article).filter(~ Article.title.in_(['title1','title3','title6'])).all()
    for r in rs:
      print(r)
def query_data_null():
  with Session() as ses:
    rs = ses.query(Article).filter(Article.content == None).all()
    for r in rs:
      print(r)
def query_data_not_null():
  with Session() as ses:
    rs = ses.query(Article).filter(Article.content != None).all()
    for r in rs:
      print(r)
def query_data_and():
  with Session() as ses:
    # rs = ses.query(Article).filter(Article.title !='title4' and Article.price >8 ).all() 
    # rs = ses.query(Article).filter(Article.title !='title4',Article.price >50 ).all() 
    rs = ses.query(Article).filter(and_(Article.title !='title4',Article.price >50) ).all() 
    for r in rs:
      print(r)
def query_data_or():
  with Session() as ses: 
    rs = ses.query(Article).filter(or_(Article.title =='title4',Article.price >50) ).all() 
    for r in rs:
      print(r)
if __name__ == '__main__':
  # Base.metadata.create_all()
  # create_data()
  # query_data()
  # query_data_equal()
  # query_data_not_equal()
  # query_data_like()
  # query_data_in()
  # query_data_not_in()
  # query_data_null()
  # query_data_not_null()
  # query_data_and()
  query_data_or()

代码刨析

  1. Article 模型类定义:
  • 你定义了一个名为 Article 的模型类,它映射到了数据库中的 t_article 表格,包括了 id、title、price 和 content 四个字段。
  1. create_data 函数:
  • 该函数在数据库中插入了一些示例数据,包括了标题、价格和内容。其中,标题的命名规则是 title{i+1} 或者 TITLE{i+1},价格是一个随机的整数,内容使用了 uuid4() 生成。
  1. query_data 函数:
  • 该函数查询了 id 为 1 的记录。
  1. query_data_equal 函数:
  • 该函数查询了标题等于 'title2' 的第
  1. query_data_not_equal 函数:
  • 该函数查询了标题不等于 'title2' 的所有记录。
  1. query_data_like 函数:
  • 该函数查询了标题以 'title' 开头的所有记录。
  1. query_data_in 函数:
  • 该函数查询了标题在 ['title1','title3','title6'] 中的所有记录。
  1. query_data_not_in 函数:
  • 该函数查询了标题不在 ['title1','title3','title6'] 中的所有记录。
  1. query_data_null 函数:
  • 该函数查询了内容为 None 的所有记录。
  1. query_data_not_null 函数:
  • 该函数查询了内容不为 None 的所有记录。
  1. query_data_and 函数:
  • 该函数查询了标题不等于 'title4' 且价格大于 50 的所有记录。
  1. query_data_or 函数:
  • 该函数查询了标题等于 'title4' 或者价格大于 50 的所有记录。
相关文章
|
监控 Cloud Native 搜索推荐
Springboot/Springcloud整合ELK平台,(Filebeat方式)日志采集及管理(Elasticsearch+Logstash+Filebeat+Kibana)
Springboot/Springcloud整合ELK平台,(Filebeat方式)日志采集及管理(Elasticsearch+Logstash+Filebeat+Kibana)
3596 0
Springboot/Springcloud整合ELK平台,(Filebeat方式)日志采集及管理(Elasticsearch+Logstash+Filebeat+Kibana)
|
9月前
|
IDE API 数据库
FastAPI + SQLModel 实战:标准项目结构下,一个模型搞定数据库与 API
SQLModel 实现“一模型双用”:单个类同时作为数据库表与 Pydantic API 模型,天然支持字段校验、类型提示、OpenAPI 文档生成,彻底消除重复定义,提升开发效率与一致性。(239字)
864 4
|
Ubuntu
Ubuntu系统镜像下载,国内镜像站大全(山大/清华/阿里/浙大/中科大...)
装Ubuntu,是很多理工科同学入门的第一个挑战,首先我们就需要找到一个能用的iso镜像,根据你的网络环境的不同,不同的站点下载速度会不一样,下面列举一下几个比较好用的,都是来自Ubuntu官方推荐镜像站链接导航国内分区
46497 1
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
32217 71
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
1210 77
|
消息中间件 存储 NoSQL
Django 实战:Celery 异步任务从环境搭建到调用全掌握
本文详解 Celery 核心概念、架构组成及工作流程,并实战演示如何在 Django 项目中集成 Celery,实现异步任务调用与事务提交控制,助你掌握从配置到部署的全流程开发技巧。
1394 3
|
Ubuntu 应用服务中间件 Linux
通过Certbot自动申请更新HTTPS网站的SSL证书
本文介绍了如何通过 Certbot 自动申请并更新 HTTPS 网站的 SSL 证书,配合 Crontab 实现自动续签,解决云服务商免费证书仅限 3 个月有效期的问题,适用于 CentOS、Debian、Ubuntu 系统,支持 Nginx 和 Apache 服务器。
3661 8
|
SQL NoSQL 前端开发
MySQL 连接数过多的处理方法合集 - Too many connections - 卡拉云
碰到`Can not connect to MySQL server. Too many connections”-mysql`错误着实令人抓狂。这基本等于失去了对 MySQL 的控制权。本教程将详细讲解多种处理此错误的方法。 sudo mysql -uroot -p ERROR 1040 (00000): Too many connections
26726 1
|
前端开发 数据可视化 JavaScript
前端echarts加标记点及标记线和提示框
通过本文的介绍,希望您能够深入理解和掌握如何在ECharts中添加标记点、标记线和提示框,并在实际项目中灵活运用这些功能,提升数据可视化效果。
2486 4