使用保留关键字或内置函数作为变量/属性名称通常被视为不好的做法。然而,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中的关键字是推荐的?
首先,id不是关键字;如果是一个,你会得到一个语法错误(尝试id用eg替换pass)。它是内置函数的全局标识符。虽然破坏 Python 定义的默认标识符是一种不好的做法,但请注意,id: Mapped[int] = mapped_column(primary_key=True)在类定义内部定义了该类的静态属性,而不是全局变量。全局函数id与静态属性不同User.id(或self.id稍后使用的 ) \xe2\x80\x94 ,那里没有冲突。
class Foo:\n id = 42\n\nprint(Foo.id)\n# => 42\nprint(id)\n# => <built-in function id>\nRun Code Online (Sandbox Code Playgroud)\n然而,正如您正确地注意到的:
\nid = "YOU SHOULDN'T DO THIS"\nprint(id)\n# => YOU SHOULDN'T DO THIS\n# (and not <built-in function id>)\nRun Code Online (Sandbox Code Playgroud)\n其次,为什么id使用它:SQLAlchemy 将类映射到具有蛇形类名的 SQL 表,并将属性映射到具有原样属性名称的 SQL 列(除非您特别说明id_: mapped_column('id', primary_key=True)),因此id和id_会是 SQL 中的不同列。
id(与 相对id_)是 SQL 中主键列的常规名称(如果存在单列主键)。有些人会将该列命名为user_id,但许多人不喜欢user_id在表中称为users,因为它应该很明显是什么users.id,因此users.user_id是多余的;表格user_id通常是为外键保留的。SQLAlchemy 示例仅遵循此 SQL 约定。
| 归档时间: |
|
| 查看次数: |
330 次 |
| 最近记录: |