在异步 SQLAlchemy 中访问提交后查询结果会产生错误

问题描述 投票:0回答:1

所以我一直在测试一些东西,并注意到每当我访问某些查询结果的更新值时,它都会抛出错误。看看下面的代码

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 的异步版本不支持它

  • 使用代码来确定是否执行我刚才介绍的操作实际上会导致错误

asynchronous sqlalchemy fastapi
1个回答
0
投票

提交会话后,与该会话关联的所有 ORM 实体都将过期。如果在过期后访问这些实体的属性,SQLAlchemy 将发出

SELECT
来刷新属性值。

在异步情况下,这是一个可等待的操作(必须等待查询的结果),但在问题的代码中不等待属性访问。

有两种可能的解决方案:

  • 在创建会话时设置
    expire_on_commit=False
  • 提交后刷新对象 (
    await session.refresh(user)
    )。
© www.soinside.com 2019 - 2024. All rights reserved.