0%

SQLModel自学教程(8) - 数据查询与SELECT

1.基础查询流程

graph TD
    A[创建Session会话] --> B[构造SELECT语句]
    B --> C[执行查询操作]
    C --> D[处理查询结果]
  • 使用SQLAlchemy的select()函数构建查询

2.全表查询示例

1
2
3
4
5
6
7
8
9
from sqlmodel import select, Session

with Session(engine) as session:
statement = select(Hero)
results = session.exec(statement)
heroes = results.all()
# 输出所有英雄信息
for hero in heroes:
print(hero)

核心要点

  • select(Hero) 等同于SQL的SELECT * FROM hero
  • session.exec()执行查询,返回结果对象
  • .all()获取所有结果列表

3.字段筛选查询

1
2
3
4
5
# 仅选择name和secret_name字段
statement = select(Hero.name, Hero.secret_name)

# 链式写法筛选年龄>30的记录
statement = select(Hero).where(Hero.age > 30).order_by(Hero.name.desc())

特性说明

  • 支持显式指定查询字段
  • 使用.where()进行条件过滤
  • 通过.order_by()实现结果排序

4.结果处理技巧

1
2
3
4
5
6
7
8
# 获取第一条记录
first_hero = session.exec(statement).first()

# 分页查询(每页5条,第3页)
paginated = session.exec(statement.limit(5).offset(10)).all()

# 统计记录数
count = session.exec(statement).count()

高级功能

  • .first()获取首条记录
  • .limit().offset()实现分页
  • .count()统计匹配记录数

5.关联查询示例

1
2
3
4
5
6
7
from sqlmodel import join

# 多表关联查询(假设有Team表)
statement = select(Hero, Team).join(Team)
results = session.exec(statement)
for hero, team in results:
print(f"{hero.name} 属于 {team.name}")

关联查询要点

  • 使用join()方法连接相关表
  • 结果返回元组形式数据
  • 支持自动解析外键关系

6.调试与优化

1
2
3
4
5
# 查看生成的SQL语句
print(statement)

# 启用SQL日志(创建engine时设置)
engine = create_engine("sqlite:///database.db", echo=True)

调试技巧

  • 直接打印statement对象查看原生SQL
  • 通过echo=True记录所有SQL操作
  • 使用DB Browser验证查询结果

提示:完整示例代码建议参考官方文档 ,复杂查询建议结合SQLAlchemy的查询构建器