所以我一直在测试一些东西,并注意到每当我访问某些查询结果的更新值时,它都会抛出错误。看看下面的代码
async def createUser() -> JSONResponse:
async with Session() as session:
userRawQuery = await session.execute(
select(User).filter(User.id == 'some-value')
)
user = userRawQuery.scalar()
# Change Username - For Testing Purposes
user.username = 'John'
await session.commit()
return JSONResponse(
content = {"msg": "Updated Creator Request"},
status_code = 200
)
这段代码运行没有问题。但当我这样做的时候
return JSONResponse(
content = {
"user": {
"id": user.id,
"username": user.username,
"age": user.age
}
},
status_code = 200
)
它会产生错误。由于某种原因,访问提交后的数据会产生错误。奇怪的。知道为什么会发生这种情况吗? SQLAlchemy 的同步方法不会出现此错误,但异步方法会出现此错误。
尝试使用“query()”方法等替代方法,但 SQLAlchemy 的异步版本不支持它
使用代码来确定是否执行我刚才介绍的操作实际上会导致错误
提交会话后,与该会话关联的所有 ORM 实体都将过期。如果在过期后访问这些实体的属性,SQLAlchemy 将发出
SELECT
来刷新属性值。
在异步情况下,这是一个可等待的操作(必须等待查询的结果),但在问题的代码中不等待属性访问。
有两种可能的解决方案:
expire_on_commit=False
。await session.refresh(user)
)。