当前位置: 首页 > news >正文

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等特殊类型,通常还是需要指定。

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

http://www.jsqmd.com/news/162049/

相关文章:

  • docker compose部署多个PyTorch实例:基于CUDA-v2.8横向扩展
  • PyTorch-CUDA-v2.8镜像是否收费?完全开源免费可商用
  • git commit规范提交代码:配合PyTorch-CUDA-v2.8进行版本控制
  • 让照片“开口说话”:SadTalker 本地部署实战,一张静态图 + 一段音频生成数字人视频
  • PyTorch-CUDA-v2.8镜像支持T4/V100/A10?云服务器兼容性一览
  • LLMs之Data:《Artificial Hivemind: The Open-Ended Homogeneity of Language Models (and Beyond)》翻译与解读
  • 机器学习所需技能
  • ssh双因素认证增强安全:保护PyTorch-CUDA-v2.8服务器
  • 封装随笔
  • 无需手动安装!PyTorch-CUDA-v2.8镜像让GPU训练开箱即用
  • PyTorch分布式数据并行(DDP)实战:基于CUDA-v2.8多卡训练
  • 漳州云霄html+css 5页
  • applyMatrix H 门的两种方式
  • 2025最新!专科生必看10个AI论文平台测评,毕业论文轻松过!
  • WinRAR零日漏洞CVE-2025-8088深度解析:俄罗斯黑客的全球攻击与防御指南
  • 最近12个月,时间范围
  • 本地没有GPU?使用PyTorch-CUDA-v2.8云镜像远程训练模型
  • jiyutrainer下载安装包包含PyTorch-CUDA-v2.8一键启动脚本
  • 【数据驱动】基于库普曼算子的凸公式来解决数据驱动的最优控制问题附Matlab代码
  • github fork项目同步上游:更新你的PyTorch-CUDA-v2.8分支
  • 经典转动理论 - Emi
  • Web开发者实战AI Agent:基于Dify实现OpenAI Deep Research智能体
  • git branch管理功能开发:为PyTorch-CUDA-v2.8添加新模块
  • conda list查看已安装包:对比PyTorch-CUDA-v2.8预装清单
  • markdown绘制流程图:展示PyTorch-CUDA-v2.8数据处理 pipeline
  • AI辅助的创业公司估值模型
  • Java毕设项目推荐-基于web的中医诊所预约挂号系统设计与实现号源管理、在线预约、复诊提醒、诊疗档案【附源码+文档,调试定制服务】
  • ssh反向代理应用场景:通过PyTorch-CUDA-v2.8暴露本地服务
  • 十二月《代码大全》读后感
  • 从实验到部署无缝衔接:PyTorch-CUDA-v2.8助力AI项目落地