SQLModel 教程:使用 select 语句查询数据
前言
SQLModel 是一个强大的 Python ORM 工具,它结合了 SQLAlchemy 和 Pydantic 的优点,为开发者提供了简单直观的数据模型定义和数据库操作方式。本文将重点介绍如何使用 SQLModel 的 select 语句进行数据查询操作。
数据模型定义
首先我们需要定义一个 Hero 数据模型,这个模型将映射到数据库中的表:
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
这个模型定义了四个字段:
id
: 主键,自动生成name
: 英雄名称,字符串类型secret_name
: 秘密身份,字符串类型age
: 年龄,可选字段
数据库连接设置
我们使用 SQLite 作为示例数据库:
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
echo=True
参数会在控制台输出执行的 SQL 语句,便于调试。
创建数据库和表
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
这个方法会创建数据库文件(如果不存在)并根据模型定义创建对应的表结构。
插入测试数据
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.add(hero_3)
session.commit()
我们创建了三个英雄实例并通过 session 添加到数据库中。
使用 select 查询数据
核心的查询方法如下:
def select_heroes():
with Session(engine) as session:
statement = select(Hero)
results = session.exec(statement)
heroes = results.all()
print(heroes)
这里有几个关键点:
select(Hero)
创建了一个查询语句,表示我们要查询 Hero 表的所有记录session.exec(statement)
执行查询语句results.all()
获取所有结果
执行流程
def main():
create_db_and_tables()
create_heroes()
select_heroes()
完整的执行流程:
- 创建数据库和表结构
- 插入测试数据
- 查询并打印所有英雄数据
查询结果分析
执行上述代码后,控制台会输出类似以下内容:
[Hero(id=1, name='Deadpond', secret_name='Dive Wilson', age=None),
Hero(id=2, name='Spider-Boy', secret_name='Pedro Parqueador', age=None),
Hero(id=3, name='Rusty-Man', secret_name='Tommy Sharp', age=48)]
这是查询到的所有英雄对象的列表表示,每个对象都包含我们在模型中定义的字段。
进阶说明
- 查询特定字段:可以使用
select(Hero.name, Hero.age)
只查询特定字段 - 条件过滤:可以添加 where 条件,如
select(Hero).where(Hero.age > 30)
- 排序:可以使用
order_by
方法对结果排序 - 分页:可以使用
offset
和limit
实现分页查询
总结
本文通过一个完整的示例演示了如何使用 SQLModel 进行基本的数据查询操作。SQLModel 的 select 语句提供了简洁直观的 API,让数据库查询操作变得更加简单。掌握这些基础知识后,可以进一步学习更复杂的查询和关系操作。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考