gpt4 book ai didi

python - 为什么 SQLAlchemy 建议使用内置的 `id` 作为列名?

转载 作者:行者123 更新时间:2023-12-03 07:55:37 24 4
gpt4 key购买 nike

使用保留关键字或内置函数作为变量/属性名称通常被视为 bad practice 。但是,SQLALchemy tutorial充满了名为 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})"

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

最佳答案

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

class Foo:
id = 42

print(Foo.id)
# => 42
print(id)
# => <built-in function id>

但是,正如您正确地注意到的:

id = "YOU SHOULDN'T DO THIS"
print(id)
# => YOU SHOULDN'T DO THIS
# (and not <built-in function id>)

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

id(与 id_ 相反)是 SQL 中主键列的常规名称(如果存在单列主键)。有些人会将列命名为 user_id,但许多人不喜欢在名为 users 的表中包含 user_id,因为它应该是显而易见的 users。 id,因此users.user_id是多余的; user_id 形式通常保留用于外键。 SQLAlchemy 示例仅遵循此 SQL 约定。

关于python - 为什么 SQLAlchemy 建议使用内置的 `id` 作为列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76108171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com