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

6

我正在评估在异步/等待 FastAPI 应用程序中使用SQLAlchemy的潜在设置。目前我正在使用 declarative_base类组合模型和查询,然后使用 Databases 执行查询(对于模型类来说,语法更可读且更易编写;直接使用SQLAlchemy核心表不是我的最爱)。这一切都非常好用。

此时,我已经有了SQLAlchemy的结果行,但需要将它们转换为通用字典,由于预加载关系可能会嵌套 (这种类型是我在此环境中支持的唯一类型)。我无法使用SQLAlchemy的ORM,因为1)我没有enginesession;并且2)ORM假定它可以随时访问数据库以加载对象,而这在异步/等待的FastAPI应用程序中不是情况。

有没有人有想法或指针可以帮助完成这个任务?我正在努力想出如何将结果行与特定的关系键相关联。尤其是,我一直在探索SQLAlchemy内部以获取灵感,但这相当不透明,因为它假设整个对象缓存层和会话/引擎管理层在我的设置中不存在。

我需要想法的两件事:

  1. 如何将列名称(例如table_1_column_name)映射到特定的模型及其属性
  2. 如何检测和映射关系(可能超过一级深度)

感谢您提供的任何帮助!

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

3个回答

2
如果你使用的是数据库优先的方式,SQLAlchemy执行方法通常会返回一个“Result Proxy”对象,你可以使用其方法(如fetchone、first、fetchall)获取结果,然后将其转换为列表或字典。你也可以参考这个文档。"Original Answer"的翻译是"最初的回答"。

我没有使用SQLAlchemy的execute方法(那需要一个engine/session),而是通过Databases使用async/await执行数据库查询。我有一些可以通过键访问的行,但这是由生成的SQLAlchemy查询的键,我需要帮助找到一种从该键映射到模型对象键的策略。 - One Crayon
请查看此Gist以获取可运行的示例;适用于此问题的代码为第92-109行:https://gist.github.com/onecrayon/dd4803a5099061fa48d52f2d4bc2396b - One Crayon

0

如果结果是原始的SQLAlchemy行而不是ORM映射实例,则将对象转换为字典应该有效。

从您在另一个答案中的评论中可以看出,您需要将结果映射回ORM实例。您可以定义声明性映射,以便将结果转换回Python实例。


我实际上是将结果映射到字典中,但诀窍在于,如果它们作为查询的一部分加载,则要包括关系。因此,对于每个父项,我可能有多个重复行,每个重复行代表一个子项。然后,我想生成一个列表,其中包含一个单独的父项,该父项包括一个child属性,该属性是结果集中每个相关的child项的列表。请参见原始问题中链接的gist以获取示例。 - One Crayon

0

1
DictAlchemy并不完全符合我的需求,因为它将ORM结果映射到字典中,而我需要将RowProxy结果包装成字典(包括关系,如果它们作为查询的一部分被加载)。不过我会尝试使用asdict() - One Crayon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接