SQLAlchemy ORM:为什么在 select 结果上使用 row[0].attribute 而不是 row.attribute

SQLAlchemy ORM: Why row[0].attribute instead of just row.attribute on select results

为什么 SQLAlchemy 的创建者决定 return rowsselect 语句中使用 ORM 表(如 User(Base))在 tuple 中第一个结果是您期望的正常结果吗?

例如,如果您的查询是这样的:

user = session.execute(select(User)).first()

他们为什么这样决定:

user_name = user[0].name

比这更好:

user_name = user.name

默认?

我相信这样做是为了让 API 与核心 api 更加一致。这也使得单个参数与多个参数兼容,即 select(User)select(User, Company.name).join(User.company) 都是 return namedtuple-like 行。文档中有一些解释:rowproxy-is-no-longer-a-proxy-is-now-called-row-and-behaves-like-an-enhanced-named-tuple

根据评论添加了更多文档链接

请注意,似乎有一些辅助方法可以使此用法更容易,session.scalar, session.scalars, scalar and scalars() 以实现您的预​​期用途。

执行此任务的多种方法:

# This is probably the most clear for a single result.
user = session.scalar(select(User))
user = session.scalars(select(User)).first()
user = session.execute(select(User)).scalar()
user = session.execute(select(User)).scalars().first()

# for looping without needing to unpack 1-tuple
for user in session.scalars(select(User)):
    print(user)

与此类用法相比

user, = session.execute(select(User)).first()
user, company_name = session.execute(select(User, Company.name).join(User.company)).first()