0%

SQLModel自学教程(9) - WHERE条件查询

1.基础条件查询

1
2
3
4
5
6
from sqlmodel import select

# 精确匹配查询
statement = select(Hero).where(Hero.name == "Spider-Boy")
# 范围查询
age_filter = select(Hero).where(Hero.age > 30)
  • where() 方法支持所有SQL比较运算符(==, >, <, >=, <=, !=
  • 支持链式调用多个条件
  • 自动转换Python类型为数据库类型

2.组合查询条件

1
2
3
4
5
6
7
8
9
10
11
from sqlmodel import and_, or_

# AND组合查询
combined_and = select(Hero).where(
and_(Hero.age >= 18, Hero.age <= 50)
)

# OR组合查询
combined_or = select(Hero).where(
or_(Hero.name == "Deadpond", Hero.secret_name.contains("Wilson"))
)

特性说明

  • and_() 实现逻辑与操作
  • or_() 实现逻辑或操作
  • 支持嵌套组合复杂条件

3.空值处理

1
2
3
4
5
# 查询年龄为空
null_query = select(Hero).where(Hero.age == None)

# 查询年龄非空
not_null_query = select(Hero).where(Hero.age != None)
  • None 自动转换为SQL的NULL
  • 支持is_not(None)替代!= None更直观

4.范围查询

1
2
3
4
5
6
7
8
9
10
11
from sqlmodel import between

# BETWEEN范围查询
age_range = select(Hero).where(
between(Hero.age, 20, 40)
)

# IN集合查询
team_filter = select(Hero).where(
Hero.team_id.in_([1, 3, 5])
)

特殊操作符

  • between() 生成BETWEEN语句
  • in_() 实现集合匹配查询
  • 支持列表参数自动展开

5.字符串操作

1
2
3
4
5
6
7
8
9
# 模糊查询
name_like = select(Hero).where(
Hero.name.like("%Spider%")
)

# 区分大小写匹配
exact_match = select(Hero).where(
Hero.secret_name.ilike("dive wilson")
)

字符串处理

  • like() 实现SQL LIKE模式匹配
  • ilike() 实现大小写不敏感匹配
  • 支持通配符%_

6.关联查询条件

1
2
3
4
5
6
7
8
9
10
11
12
# 关联Team表查询
team_query = select(Hero).join(Team).where(
Team.name == "Avengers"
)

# 多表联合过滤
complex_filter = select(Hero).join(Team).where(
and_(
Hero.age > 25,
Team.create_year >= 2020
)
)

关联查询要点

  • 使用join()明确表关联关系
  • 支持跨表字段作为过滤条件
  • 自动处理外键关系

7.执行流程

graph LR
    A[构建SELECT语句] --> B[添加WHERE条件]
    B --> C[执行查询]
    C --> D[转换结果为模型对象]
  • 条件语句延迟执行机制
  • 自动映射查询结果到模型实例
  • 支持分页(limit/offset)

提示:完整示例代码建议参考官方文档,复杂查询推荐结合SQLAlchemy的查询构建器实现更灵活的条件组合