问题描述
我想使用 FastAPI StreamingResponse
返回大型数据集,并在存储库/逻辑层中,在完成查询工作之后,我将以这种方式返回数据:>
for record in query.yield_per(DATA_RECORDS_LIMIT):
yield record.to_entity()
最初,我遇到了一些编码问题(缺少编码器方法,无法序列化日期时间等...),感谢这个https://github.com/encode/starlette/issues/419#issuecomment-470077657和这个https://fastapi.tiangolo.com/tutorial/encoder/#using-the-jsonable_encoder,我最终在Web处理程序:
...
results = get_data()
def _encoded_results():
yield "["
for idx,item in enumerate(results):
if idx > 0:
yield ","
yield json.dumps(jsonable_encoder(item.dict()))
yield "]"
return StreamingResponse(_encoded_results())
现在...在您问之前:是的,它有效,但是我想知道所有这一切是否必要,或者是否有更好的方法 。要添加更多上下文,第一个代码段中的记录是一个 sqlAlchemy 模型实例,然后.to_entity()
将其转换为一个 Pydantic 数据实例。在第二个代码段中,我在pydantic类上调用.dict()
,因此我得到了一个Python dict
,可以在被jsonable_encoder
之前通过.json.dumps(...)
传递。
我很确定我不是唯一尝试使用FastAPI返回/流式传输非常大的数据集的人,所以我想知道是否有内置的或更好的方法来执行此操作。谢谢
注意:我的主要担心(以防万一,我不清楚)是关于给定 Pydantic 实体的事实,我需要先致电{{1} }方法,则需要先通过.dict()
,最后要通过jsonable_encoder
。我希望此转换在FastAPI内的某个地方实现,并在Web处理程序中隐藏。不需要TL / DR json.dumps
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)