如何将SQLAlchemy结果行转换为嵌套字典

时间:2019-07-27 03:20:36

标签: python sqlalchemy async-await fastapi

我正在评估在异步/等待FastAPI应用中使用SQLAlchemy的潜在设置。我目前正在使用declarative_base类编写模型和查询,然后使用Databases执行查询(对于模型类,语法更易读易写;直​​接使用SQLAlchemy核心表不是我的工作最喜欢的活动)。这一切都很好。

在这一点上,我有SQLAlchemy结果行,但是我需要将它们转换为通用dict,由于渴望加载关系而可能嵌套(仅在此环境中我将支持的类型)。我不能使用SQLAlchemy的ORM,因为1)我没有enginesession;和2)ORM假定只要需要将其加载到对象中就可以访问数据库,而在异步/等待FastAPI应用程序中则不是这种情况。

有人对实现此目标有想法或指示吗?我正在努力弄清楚如何将结果行与特定的关系键相关联。我一直在研究SQLAlchemy内部的想法,但是它很不透明,因为其中很多都假设我的设置中没有出现整个对象缓存和会话/引擎管理层。

我可以使用以下两个想法:

  1. 如何将诸如table_1_column_name之类的列名映射到特定模型及其属性
  2. 如何检测和映射关系(可能超过一个层次)

感谢您提供的任何帮助!

更新:您可以在此处找到一个可运行的示例:https://gist.github.com/onecrayon/dd4803a5099061fa48d52f2d4bc2396b(有关第92-109行的相关位置,我需要弄清楚如何将RowProxy转换为嵌套dict通过将查询列名称映射到SQLAlchemy模型上的名称)。

3 个答案:

答案 0 :(得分:0)

如果您首先是数据库,则sqlalchemy execute方法通常会返回一个 Result Proxy 对象,您可以使用其方法(例如fetchone,first,fetchall)获取其结果,然后将其强制转换为list或字典 您还可以看到this dock

答案 1 :(得分:0)

如果结果是原始SQLAlchemy行而不是ORM映射的实例,则

Casting the object into a dict应该可以工作。

从您对另一个答案的评论来看,您似乎需要将结果映射回ORM实例。您可以定义declarative mappings,以便将结果转换回python实例。

答案 2 :(得分:0)

SQLALchemy对象可以选择返回dict- 这是SQLALchemy的源文档,可以为您提供帮助。 https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.util.KeyedTuple._asdict

或者,您可以使用https://pythonhosted.org/dictalchemy作为SQLALchemy的包装器。

希望有帮助。