
大家好我是Java1234_小锋老师。如果你用 Python 写过后端大概率接触过 SQLAlchemy。到了 2.0 版本它不再只是「老项目的标配」而是成了很多新项目的第一选择。这篇文章聊聊大家为什么开始转向 SQLAlchemy 2。先说结论2.0 到底变了什么SQLAlchemy 2.0 不是小修小补而是一次面向现代 Python 的重构。简单说它做了三件事查询写法统一了—— 不再混用session.query()和select()两套风格类型提示更友好—— 配合 IDE写代码时能少踩很多坑异步是一等公民—— 原生支持async/await不用绕来绕去下面这张图可以帮你快速感受 1.x 和 2.0 的差异五个让人愿意升级的理由1. 查询语法终于「说人话」了1.x 时代大家习惯这样写# SQLAlchemy 1.x 风格旧写法userssession.query(User).filter(User.age18).all()2.0 推荐统一用select()更接近原生 SQL 的阅读习惯# SQLAlchemy 2.0 推荐写法fromsqlalchemyimportselect stmtselect(User).where(User.age18)userssession.scalars(stmt).all()好处很明显新人上手更快老 SQL 背景的人也能一眼看懂。2. 类型提示让 IDE 真正帮得上忙2.0 的模型和查询结果配合类型注解后PyCharm、VS Code 都能给出更准确的补全和报错提示。fromsqlalchemy.ormimportDeclarativeBase,Mapped,mapped_columnclassBase(DeclarativeBase):passclassUser(Base):__tablename__t_userid:Mapped[int]mapped_column(primary_keyTrue)name:Mapped[str]mapped_column(String(50))age:Mapped[int]mapped_column(default0)字段类型写清楚后面查出来的对象IDE 知道user.name是字符串user.age是整数 ——少写很多低级错误。3. 异步支持不再是「附加功能」现在做 Web 后端FastAPI、Starlette 这类异步框架很流行。SQLAlchemy 2.0 内置了异步引擎和异步 Session不用再依赖第三方封装。4. 官方文档和社区方向都指向 2.0新教程、新示例、新项目的脚手架基本都以 2.0 为准。跟着主流走遇到问题更容易搜到答案。5. 性能和内部实现也有优化底层做了不少清理和优化虽然日常项目未必能立刻感知但长期维护一个 ORM 框架这种「还债式升级」对生态是健康的。从 1.x 到 2.0迁移并不吓人很多人迟迟不升级是怕「一改全改、项目瘫痪」。其实官方提供了过渡方案可以逐步迁移。小项目大项目现有 1.x 项目评估代码量直接升级到 2.0 语法开启 2.0 兼容模式逐模块替换 query 写法全面使用 select Session测试通过上线核心思路就一条先让项目能在 2.0 下跑起来再慢慢改写法不必一夜重构。上手案例定义模型、查数据、写事务下面是一个最小可运行的示例展示 2.0 的常见用法。连接数据库fromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportsessionmaker# 连接 MySQL示例DATABASE_URLmysqlpymysql://root:123456localhost/db_blog?charsetutf8mb4enginecreate_engine(Database_URL,echoTrue)SessionLocalsessionmaker(bindengine)定义模型并建表fromsqlalchemyimportStringfromsqlalchemy.ormimportDeclarativeBase,Mapped,mapped_columnclassBase(DeclarativeBase):passclassArticle(Base):文章表__tablename__t_articleid:Mapped[int]mapped_column(primary_keyTrue,autoincrementTrue)title:Mapped[str]mapped_column(String(200))author:Mapped[str]mapped_column(String(50),default匿名)# 创建表结构Base.metadata.create_all(engine)增删改查fromsqlalchemyimportselectdefdemo_crud():演示基本的增删改查操作withSessionLocal()assession:# 新增articleArticle(titleSQLAlchemy 2 入门,author小明)session.add(article)session.commit()# 查询stmtselect(Article).where(Article.author小明)resultsession.scalars(stmt).all()print(f查到{len(result)}篇文章)# 更新ifresult:result[0].titleSQLAlchemy 2 实战笔记session.commit()# 删除session.delete(result[0])session.commit()事务流程日常开发里数据库操作大多遵循「开 Session → 执行 → 提交或回滚 → 关闭」这条线是否开始打开 Session执行增删改查是否成功?commit 提交rollback 回滚关闭 Session结束2.0 里用with SessionLocal() as session:上下文管理器能自动处理关闭写法也更安全。异步支持跟 FastAPI 很搭异步是 2.0 被大量采用的另一个重要原因。下面是一个和 FastAPI 配合的简化示例fromfastapiimportFastAPI,Dependsfromsqlalchemy.ext.asyncioimportcreate_async_engine,async_sessionmaker,AsyncSessionfromsqlalchemyimportselect appFastAPI()# 异步引擎以 aiomysql 为例async_enginecreate_async_engine(mysqlaiomysql://root:123456localhost/db_blog?charsetutf8mb4)AsyncSessionLocalasync_sessionmaker(async_engine,expire_on_commitFalse)asyncdefget_db():依赖注入获取异步 SessionasyncwithAsyncSessionLocal()assession:yieldsessionapp.get(/articles)asyncdeflist_articles(db:AsyncSessionDepends(get_db)):stmtselect(Article).limit(10)articles(awaitdb.scalars(stmt)).all()return[{id:a.id,title:a.title}forainarticles]同一份模型定义同步和异步都能复用 ——这是 2.0 在工程上非常实用的一点。什么时候还不必急着换说了很多优点也要诚实讲几句老项目稳定运行、没人动不必为了升级而升级团队没人熟悉 2.0 语法贸然切换可能增加短期成本依赖的第三方库还没适配 2.0需要先做兼容性调研但如果你的项目是新启动的 Python 后端或者正在技术栈升级现在直接上 SQLAlchemy 2.0一般是更省心的选择。写在最后越来越多人转向 SQLAlchemy 2不是因为追新而是因为它真的更好写、更好维护、更贴合现在的 Python 生态。统一的查询风格、完善的类型支持、原生异步、清晰的迁移路径 —— 这些加在一起让 2.0 从「可选项」变成了「默认推荐」。如果你还在用 1.x不妨从一个新模块、一个小服务开始亲手写几段 2.0 代码。很多时候迁移成本没有想象中那么大但开发体验的提升是立竿见影的。