为什么 SQLAlchemy 建议使用内置的“id”作为列名?

emi*_*laz 2 python sqlalchemy

使用保留关键字或内置函数作为变量/属性名称通常被视为不好的做法。然而,SQLALchemy教程充满了名为 的属性的示例id

直接从教程开始

>>> 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})"
Run Code Online (Sandbox Code Playgroud)

为什么不建议使用它id_来代替,至少对于PEP 8中的关键字是推荐的?

Ama*_*dan 5

首先,id不是关键字;如果是一个,你会得到一个语法错误(尝试id用eg替换pass)。它是内置函数的全局标识符。虽然破坏 Python 定义的默认标识符是一种不好的做法,但请注意,id: Mapped[int] = mapped_column(primary_key=True)在类定义内部定义了该类的静态属性,而不是全局变量。全局函数id与静态属性不同User.id(或self.id稍后使用的 ) \xe2\x80\x94 ,那里没有冲突。

\n
class Foo:\n    id = 42\n\nprint(Foo.id)\n# => 42\nprint(id)\n# => <built-in function id>\n
Run Code Online (Sandbox Code Playgroud)\n

然而,正如您正确地注意到的:

\n
id = "YOU SHOULDN'T DO THIS"\nprint(id)\n# => YOU SHOULDN'T DO THIS\n# (and not <built-in function id>)\n
Run Code Online (Sandbox Code Playgroud)\n

其次,为什么id使用它:SQLAlchemy 将类映射到具有蛇形类名的 SQL 表,并将属性映射到具有原样属性名称的 SQL 列(除非您特别说明id_: mapped_column('id', primary_key=True)),因此idid_会是 SQL 中的不同列。

\n

id(与 相对id_)是 SQL 中主键列的常规名称(如果存在单列主键)。有些人会将该列命名为user_id,但许多人不喜欢user_id在表中称为users,因为它应该很明显是什么users.id,因此users.user_id是多余的;表格user_id通常是为外键保留的。SQLAlchemy 示例仅遵循此 SQL 约定。

\n