SQLAlchemy ORM:为什么在 select 结果上使用 row[0].attribute 而不是 row.attribute
SQLAlchemy ORM: Why row[0].attribute instead of just row.attribute on select results
为什么 SQLAlchemy 的创建者决定 return rows
从 select
语句中使用 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()
为什么 SQLAlchemy 的创建者决定 return rows
从 select
语句中使用 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()