SQLModel 教程:使用 Python ORM 进行数据库插入操作
前言
SQLModel 是一个强大的 Python ORM 工具,它结合了 SQLAlchemy 和 Pydantic 的优点,为开发者提供了类型安全且易于使用的数据库操作接口。本文将详细介绍如何使用 SQLModel 进行数据库表的创建和数据插入操作。
环境准备
在开始之前,确保你已经安装了 SQLModel 和必要的依赖。本文示例将使用 SQLite 数据库作为演示,但 SQLModel 同样支持 PostgreSQL、MySQL 等其他数据库。
定义数据模型
在 SQLModel 中,我们首先需要定义数据模型。数据模型既是数据库表的映射,也是数据验证的 schema。
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
模型解析
table=True
表示这个类不仅是一个 Pydantic 模型,还是一个数据库表Field
用于定义字段属性,如主键、索引等foreign_key
定义了外键关系,这里表示 Hero 属于某个 Team
数据库连接配置
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)
这个方法会创建所有定义的表结构。SQLModel 会自动处理表之间的关系。
插入数据
数据插入是数据库操作的基础,SQLModel 提供了简单直观的方式:
def create_heroes():
with Session(engine) as session:
# 创建团队记录
team_preventers = Team(name="Preventers", headquarters="Sharp Tower")
team_z_force = Team(name="Z-Force", headquarters="Sister Margaret's Bar")
session.add(team_preventers)
session.add(team_z_force)
session.commit()
# 创建英雄记录
hero_deadpond = Hero(
name="Deadpond", secret_name="Dive Wilson", team_id=team_z_force.id
)
hero_rusty_man = Hero(
name="Rusty-Man",
secret_name="Tommy Sharp",
age=48,
team_id=team_preventers.id,
)
hero_spider_boy = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
session.add(hero_deadpond)
session.add(hero_rusty_man)
session.add(hero_spider_boy)
session.commit()
# 刷新对象以获取数据库生成的值
session.refresh(hero_deadpond)
session.refresh(hero_rusty_man)
session.refresh(hero_spider_boy)
print("Created hero:", hero_deadpond)
print("Created hero:", hero_rusty_man)
print("Created hero:", hero_spider_boy)
关键点说明
- 使用
Session
上下文管理器管理数据库会话 session.add()
将对象添加到会话中session.commit()
提交事务,将更改持久化到数据库session.refresh()
从数据库重新加载对象,获取自动生成的 ID 等字段
主程序入口
def main():
create_db_and_tables()
create_heroes()
if __name__ == "__main__":
main()
最佳实践
- 总是使用上下文管理器 (
with Session...
) 来管理会话 - 复杂的插入操作应该放在事务中
- 对于批量插入,考虑使用
session.bulk_save_objects()
提高性能 - 在生产环境中,应该添加适当的错误处理和日志记录
总结
通过本文,我们学习了如何使用 SQLModel 定义数据模型、创建数据库表以及插入数据。SQLModel 的类型提示和简洁 API 使得数据库操作更加安全和直观。下一步可以探索更复杂的查询、更新和删除操作,以及关系的高级用法。
希望这篇教程能帮助你快速上手 SQLModel 的基础数据库操作。在实际项目中,这些基础知识将为你构建更复杂的数据访问层打下坚实基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考