标量()遗漏列
scalars() leaving out column
我有以下代码应该获取用户的最后已知操作并将其时间戳插入用户对象:
async def get_last_activity(users, db):
user_ids = [user.id for user in users]
event_query = select(func.max(EventModel.datetime), EventModel.user_id).\
where(EventModel.user_id.in_(user_ids)).\
group_by(EventModel.user_id)
events = (await db.execute(event_query)).scalars()
for event in events:
print(event)
for user in users:
if event.user_id == user.id:
user.last_activity = event.datetime
return users
@router.get(
'/manageable',
response_model=Users,
)
async def get_manageable_users(
db: Session = Depends(get_db)
):
""" Returns a list of users that the current user can manage """
# @TODO: get users based on authorization helper.
users = (await db.execute(select(UserModel))).scalars().all()
users = await get_last_activity(users, db)
return [{
'id': user.id,
'name': user.name,
'email': user.email,
'last_activity': user.last_activity
} for user in users]
这会导致以下错误:
File "./app/api/v1/users/read.py", line 26, in get_last_activity
if event.user_id == user.id:
AttributeError: 'datetime.datetime' object has no attribute 'user_id
即使在生成的查询中选择了该列:
api001_1 | 2021-08-11 09:19:16,514 INFO sqlalchemy.engine.Engine SELECT max(events.datetime) AS max_1, events.user_id
api001_1 | FROM events
api001_1 | WHERE events.user_id IN (%s, %s) GROUP BY events.user_id
api001_1 | 2021-08-11 09:19:16,515 INFO sqlalchemy.engine.Engine [generated in 0.00323s] (1, 2)
api001_1 | 2016-10-07 22:00:29 <---------- print(event)
有谁知道为什么 user_id 列没有出现在事件对象中?
更新:
是 scalars()
导致了这个问题。没有它,这是 print(event)
:
的输出
(datetime.datetime(2016, 10, 7, 22, 0, 29), 1)
在 运行 个标量之后,仅提取日期时间
所以标量似乎完全忽略了最后一个数字 user_id。为什么?
我的印象是 scalars()
应该将结果映射到一个对象。在更仔细地阅读文档后,它只能用一列来做到这一点。此(可选)参数默认为 0(列索引),因此仅选择日期时间。
我不再使用 .scalars() 而是必须执行 row[0], row[1]
我有以下代码应该获取用户的最后已知操作并将其时间戳插入用户对象:
async def get_last_activity(users, db):
user_ids = [user.id for user in users]
event_query = select(func.max(EventModel.datetime), EventModel.user_id).\
where(EventModel.user_id.in_(user_ids)).\
group_by(EventModel.user_id)
events = (await db.execute(event_query)).scalars()
for event in events:
print(event)
for user in users:
if event.user_id == user.id:
user.last_activity = event.datetime
return users
@router.get(
'/manageable',
response_model=Users,
)
async def get_manageable_users(
db: Session = Depends(get_db)
):
""" Returns a list of users that the current user can manage """
# @TODO: get users based on authorization helper.
users = (await db.execute(select(UserModel))).scalars().all()
users = await get_last_activity(users, db)
return [{
'id': user.id,
'name': user.name,
'email': user.email,
'last_activity': user.last_activity
} for user in users]
这会导致以下错误:
File "./app/api/v1/users/read.py", line 26, in get_last_activity
if event.user_id == user.id:
AttributeError: 'datetime.datetime' object has no attribute 'user_id
即使在生成的查询中选择了该列:
api001_1 | 2021-08-11 09:19:16,514 INFO sqlalchemy.engine.Engine SELECT max(events.datetime) AS max_1, events.user_id
api001_1 | FROM events
api001_1 | WHERE events.user_id IN (%s, %s) GROUP BY events.user_id
api001_1 | 2021-08-11 09:19:16,515 INFO sqlalchemy.engine.Engine [generated in 0.00323s] (1, 2)
api001_1 | 2016-10-07 22:00:29 <---------- print(event)
有谁知道为什么 user_id 列没有出现在事件对象中?
更新:
是 scalars()
导致了这个问题。没有它,这是 print(event)
:
的输出
(datetime.datetime(2016, 10, 7, 22, 0, 29), 1)
在 运行 个标量之后,仅提取日期时间
所以标量似乎完全忽略了最后一个数字 user_id。为什么?
我的印象是 scalars()
应该将结果映射到一个对象。在更仔细地阅读文档后,它只能用一列来做到这一点。此(可选)参数默认为 0(列索引),因此仅选择日期时间。
我不再使用 .scalars() 而是必须执行 row[0], row[1]