news 2026/4/15 16:13:45

SQLAlchemy 2.0 类型注解指南:`Mapped` 与 `mapped_column`

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQLAlchemy 2.0 类型注解指南:`Mapped` 与 `mapped_column`

简介

在 SQLAlchemy 1.4 和 2.0 中,ORM(对象关系映射)引入了一种新的声明式映射系统,核心组件是Mapped类型注解和mapped_column构造函数。这种新风格旨在提供更好的 Python 类型提示(Type Hinting)支持,解决旧版Column写法在静态代码分析(如 Pyright, MyPy)和 IDE 自动补全方面的问题。

解决的问题

1. 静态类型检查报错

这是最常见的问题。在旧版写法中,模型属性被定义为Column对象,例如:

id=Column(Integer,primary_key=True)

对于静态分析工具(如 Pyright),id的类型是Column[Integer]。然而,当你实例化模型对象访问user.id时,其实际值是int类型。

当你尝试将user.id传递给一个期望int的函数时,Pyright 会报错:

Argument of type “Column[Integer]” cannot be assigned to parameter of type “int”

Mapped解决了这个问题。它明确告诉类型检查器,虽然我们在类定义中使用了描述符,但在实例中该属性表现为指定的 Python 类型。

2. IDE 智能感知

由于类型明确,现代 IDE(如 VS Code, PyCharm)能更准确地提供代码补全和错误提示。例如,定义为Mapped[str | None]的字段,IDE 会提示你该字段可能为 None。

用法对比

1. 基本字段

旧写法 (Legacy):

fromsqlalchemyimportColumn,Integer,StringclassUser(Base):__tablename__="user"id=Column(Integer,primary_key=True)name=Column(String(50),nullable=False)email=Column(String(100))

新写法 (Modern - SQLAlchemy 2.0+):

fromsqlalchemy.ormimportMapped,mapped_columnfromsqlalchemyimportStringfromtypingimportOptionalclassUser(Base):__tablename__="user"# Mapped[int] 告诉类型检查器:实例中的 id 是 int 类型# mapped_column(...) 定义了数据库列的属性id:Mapped[int]=mapped_column(primary_key=True)# nullable=False 是默认的,对应 Mapped[str]name:Mapped[str]=mapped_column(String(50))# Optional[str] 或 str | None 对应 nullable=Trueemail:Mapped[Optional[str]]=mapped_column(String(100))

2. 复杂类型 (UUID, DateTime)

旧写法:

importuuidfromsqlalchemy.dialects.postgresqlimportUUIDfromsqlalchemyimportColumn,DateTime,funcclassDocument(Base):id=Column(UUID(as_uuid=True),primary_key=True,default=uuid.uuid4)created_at=Column(DateTime(timezone=True),server_default=func.now())

新写法:

importuuidfromdatetimeimportdatetimefromsqlalchemy.ormimportMapped,mapped_columnfromsqlalchemy.dialects.postgresqlimportUUIDfromsqlalchemyimportDateTime,funcclassDocument(Base):# 明确指定 id 是 uuid.UUID 类型id:Mapped[uuid.UUID]=mapped_column(UUID(as_uuid=True),primary_key=True,default=uuid.uuid4)# 明确指定 created_at 是 datetime 类型created_at:Mapped[datetime]=mapped_column(DateTime(timezone=True),server_default=func.now())

3. 外键与关系

旧写法:

fromsqlalchemyimportForeignKeyfromsqlalchemy.ormimportrelationshipclassPost(Base):user_id=Column(Integer,ForeignKey("user.id"))user=relationship("User")

新写法:

fromsqlalchemyimportForeignKeyfromsqlalchemy.ormimportMapped,mapped_column,relationshipclassPost(Base):user_id:Mapped[int]=mapped_column(ForeignKey("user.id"))# 这里的 relationship 也支持 Mapped 类型user:Mapped["User"]=relationship()

关键点总结

  1. 导入: 使用from sqlalchemy.orm import Mapped, mapped_column
  2. 类型注解: 必须为每个列添加 Python 类型注解(如: Mapped[int])。
  3. Nullable:
    • Mapped[str]隐含nullable=False
    • Mapped[Optional[str]]Mapped[str | None]隐含nullable=True
  4. SQL 类型: 在mapped_column()中通过第一个参数指定 SQL 类型(如String(50)),如果类型可以从 Python 类型推断(如int->Integer),则可以省略。但对于String(需要长度)或UUID等特殊类型,通常还是需要指定。

通过采用这种新写法,你的代码将更加健壮,更易于维护,并且能通过严格的静态类型检查。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 0:29:38

《重磅资讯!AI应用架构师对金融科技与AI未来发展的深刻见解》

重磅资讯!AI应用架构师对金融科技与AI未来发展的深刻见解 关键词:金融科技、AI、应用架构、风险评估、智能投顾、发展趋势 摘要:本文以AI应用架构师的视角,深入探讨金融科技与AI融合的现状、原理及未来发展。开篇阐述金融科技中AI应用的背景与重要性,点明核心问题。通过…

作者头像 李华
网站建设 2026/4/15 12:48:20

git submodule管理子项目:集成PyTorch-CUDA-v2.8作为依赖

git submodule管理子项目:集成PyTorch-CUDA-v2.8作为依赖 在AI工程实践中,最让人头疼的往往不是模型设计本身,而是“环境配置”这个隐形门槛。你有没有遇到过这样的场景?同事发来一段完美运行的训练代码,你兴冲冲地克隆…

作者头像 李华
网站建设 2026/4/15 12:48:47

cuda安装补丁包说明:PyTorch-CUDA-v2.8已集成最新修复

PyTorch-CUDA-v2.8镜像深度解析:集成补丁包带来的稳定性革新 在AI研发一线,你是否经历过这样的场景?新同事入职第一天,花整整两天才把PyTorch环境搭好;团队成员之间因为CUDA版本不一致导致模型训练结果无法复现&#x…

作者头像 李华
网站建设 2026/4/15 12:48:20

cnn卷积神经网络入门:利用PyTorch-CUDA-v2.8快速搭建

CNN卷积神经网络入门:利用PyTorch-CUDA-v2.8快速搭建 在图像识别、自动驾驶和医疗影像分析日益普及的今天,深度学习已经不再是实验室里的神秘技术,而是实实在在推动产业变革的核心动力。然而,对于刚接触这一领域的开发者来说&…

作者头像 李华
网站建设 2026/4/10 6:54:29

亲测有效!论文ai率太高,自己怎么快速降aigc率【2025保姆级指南】

说实话,谁没经历过被知网、维普那些冰冷的红色数字支配的恐惧?但这就是2025年的现状,高校对于论文降aigc的审查只会越来越严。为了帮大家解决这个燃眉之急,不让大家因为AI率延毕,我花了一周时间,自费测试了…

作者头像 李华