为何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
相关产品推荐
相关产品推荐

