因此,我一直在测试一些东西,并注意到每当我访问某些查询结果的更新值时,它都会抛出一个错误。看看下面的代码
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)
)。请参阅有关使用 AsyncSession 时防止隐式 IO 的文档。