You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQLAlchemy推荐使用内置`id`作为列名而非`id_`?

为什么SQLAlchemy教程用id而非PEP8推荐的id_?

虽然PEP8确实建议给内置函数/保留字加下划线(比如用id_代替id)来避免命名冲突,但SQLAlchemy官方教程坚持用id作为主键属性名,主要有这几个原因:

  • 数据库行业的通用惯例:在数据库设计里,单表主键几乎默认命名为id,这是全球开发者默认的共识。ORM的核心是做数据库表和Python类的映射,用id能直接对应数据库字段,不用在代码和数据库之间做“id_对应id”的转换,降低心智负担,让代码和数据库结构更一致。

  • 实际冲突风险极低:Python里的id()是用来获取对象内存地址的内置函数,但在ORM模型的开发场景中,几乎不会在操作模型实例时用到这个函数——你写user.id的时候,所有人都知道是取主键值,没人会把它当成内置函数调用。就算真的需要用到内置id(),直接写__builtins__.id(obj)就能避开冲突,这种场景在实际开发中少之又少,完全不足以抵消“和数据库字段一致”带来的便利。

  • PEP8本身允许灵活变通:PEP8是推荐性规范,不是硬性规定,它明确提到“当有更合理的理由时,可以偏离规范”。SQLAlchemy团队选择优先遵循数据库领域的惯例,而非单纯死守PEP8的命名建议,本质是为了让ORM工具的使用更贴合实际开发场景。

你提到的教程示例:

class User(Base):
    __tablename__ = "user_account"

    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(30))
    fullname: Mapped[Optional[str]]

    addresses: Mapped[List["Address"]] = relationship(
        back_populates="user", cascade="all, delete-orphan"
    )

    def __repr__(self) -> str:
        return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"

这里的id完全符合数据库主键的命名习惯,也是SQLAlchemy社区长期以来的通用写法,几乎所有基于SQLAlchemy的项目都会这么用。

内容的提问来源于stack exchange,提问作者emilaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:52:42