tylrr 2023-06-29 12:32 采纳率: 84.6%
浏览 24
已结题

fastapi数据读取问题:为什么在同一次访问中,从数据库读取的数据总是一样的?即使我在程序过程中修改了数据。

我在一个fastapi接口中,循环读取数据库中的数据。 但是我发现在同一次对 /getData的 访问过程中, 无论我怎么修改数据库,输出的数据却还是原来的数据。除非我重新访问 /getData 。 请问应该如何修改代码,使其在我修改数据后马上就输出新数据呢?谢谢



```python
@router.get('/getData/')
async def get_data(db: Session = Depends(get_db)): 
    await asyncio.sleep(1)
    for x in range(0,10):        
        data = db_my.get_lastestSpeData( db)     #从数据库中查询记录并传给data变量
        print(data)
        await asyncio.sleep(10)    #在程序10秒等待期间,我修改了数据库数据,但是输出的data变量仍然是未修改的。
        
以下为 db_my.get_lastestSpeData 函数代码

```python
def get_lastestSpeData(db: Session ):
    return db.query(DbMy).order_by(desc(DbMy.times)).first()

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2023-06-29 13:24
    关注

    来源GPT
    看起来你的代码中定义了一个路由来处理"/getData/"的GET请求。在这个路由中,你使用了asyncio来引入延迟并以异步方式执行某些操作。

    从提供的代码片段来看,你使用get_db依赖项获取了一个数据库会话(db)。在get_data函数中,你调用get_lastestSpeData函数从数据库中检索最新的记录,根据DbMy表中的times列排序。

    然而,你提到在10秒的等待期间修改数据库数据后,data变量仍然包含未更改的数据。这个行为可能是由于你使用数据库会话的方式以及代码的异步性质所导致的。

    假设你正在使用与SQLAlchemy兼容的异步数据库库,你应该确保在每次循环迭代中使用更新的会话。会话应该被刷新以反映数据库中的任何更改。下面是一个更新后的代码示例,其中包含会话刷新的步骤:

    @router.get('/getData/')
    async def get_data(db: Session = Depends(get_db)): 
        await asyncio.sleep(1)
        for x in range(0, 10):
            
            data = db_my.get_latest_spe_data(db)
            print(data)
            await asyncio.sleep(10)
    
    def get_latest_spe_data(db: Session):
        db.refresh(db)  # 刷新会话以反映数据库中的任何更改
        return db.query(DbMy).order_by(desc(DbMy.times)).first()
    
    

    通过调用db.refresh(db),会话被刷新,以确保检索的数据反映数据库的当前状态。这样,你应该能够在循环的后续迭代中获取到修改后的数据。

    注意,函数名get_lastestSpeData已经更新为get_latest_spe_data,以符合Python的命名约定(小写字母和下划线)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 修改了问题 6月29日
  • 修改了问题 6月29日
  • 展开全部