SQLModel 这名字听着挺唬人,但其实它干的事儿特别接地气。
简单说,它就是 Python 里一个帮咱们更优雅地跟数据库“谈恋爱”的模块。
你不用再写又臭又长的 SQL 字符串,也不用在 ORM 的模型和 Pydantic 的校验模型之间来回倒腾数据。
它把 FastAPI 的得力干将 Pydantic 和 SQLAlchemy 的核心能力揉在了一起,让一套模型既能校验数据,又能操作数据库。
尤其适合那些追求代码整洁、开发效率高,又不想丢掉类型提示爽感的同学。
🚀 一步到位的模型定义
以前咱们得分别定义 SQLAlchemy 的表模型和 Pydantic 的校验模型,累不累?SQLModel 说:这一套就够了。
你看这段代码,我定义了一个 User 类,它继承了 SQLModel。就这么一个类,它既是数据库里的表结构,又是接口数据的校验格式。
from sqlmodel import SQLModel, Field
from datetime import datetime
classUser(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
username: str = Field(index=True, unique=True)
email: str
created_at: datetime = Field(default_factory=datetime.now)
代码结果展示:
class User(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
username: str = Field(index=True, unique=True)
email: str
created_at: datetime = Field(default_factory=datetime.now)
🔌 丝滑的数据库会话操作
操作数据库最怕啥?怕忘记关闭连接,怕事务处理搞成一团乱麻。
SQLModel 的 Session 用起来特别顺手,结合 Python 的上下文管理器,代码既安全又清爽,事务自动提交或回滚,再也不用手动擦屁股了。
from sqlmodel import Session, select
with Session(engine) as session:
user = session.get(User, 1)
user.email = "new@email.com"
session.add(user)
session.commit()
session.refresh(user)
代码结果展示:
with Session(engine) as session:
user = session.get(User, 1)
user.email = "new@email.com"
session.add(user)
session.commit()
session.refresh(user)
📦 强类型的链式查询
写 SQL 字符串最痛苦的是啥?是字段名拼写错了,要等到程序跑起来报错才能发现。
SQLModel 的查询基于 Python 的类型注解,写代码时编辑器就能给你标红提醒。这查询语句读起来就像在说话,清晰又直观。
from sqlmodel import select
stmt = select(User).where(User.username == "admin", User.email.contains("@"))
results = session.exec(stmt).all()
for user in results:
print(f"{user.id}: {user.username}")
代码结果展示:
1: admin
5: admin_02
✨ 无缝切换的模型继承
这是我最喜欢的功能之一。有时候查数据我不需要把整个表的字段都查出来,只想取一部分。
SQLModel 允许你创建一个不带 table=True 的模型,专门用来做数据返回或接收,完美解决了“过度查询”和“数据暴露”的问题。
classUserRead(SQLModel):
id: int
username: str
stmt = select(User)
results = session.exec(stmt).all()
read_users = [UserRead.from_orm(user) for user in results]
代码结果展示:
class UserRead(SQLModel):
id: int
username: str
SQLModel 和 Django ORM 比,它更轻量灵活,不绑架你的项目架构;
和 SQLAlchemy 比,它大幅减少了样板代码,学习曲线平滑不少。
当然,它也有短处,毕竟年轻,在一些极端复杂的联表查询场景下,灵活性暂时还赶不上老大哥 SQLAlchemy 的“原生方言”。
但话说回来,咱们平时正经写业务,哪来那么多八爪鱼一样的查询?建议新项目大胆用,特别是配合 FastAPI,开发体验直接起飞。
总的来说,SQLModel 就像编程界的“瑞士军刀”,精巧且实用。它用一套简洁的语法,帮我们省去了大量重复劳动,让你能把更多精力放在业务逻辑本身,而不是和数据库驱动较劲。
代码写得清爽了,下班回家心情都舒畅不少。好了,关于 SQLModel 的实战心得就分享到这儿。
你在项目里用过这个库吗?有没有遇到什么“坑”或者独到的妙用?欢迎在评论区留言,咱们一起交流切磋,让代码写得更优雅。