6

我正在评估在 async/await FastAPI应用程序中使用 SQLAlchemy 的潜在设置。我目前正在使用declarative_base类组合模型和查询,然后使用数据库执行查询(模型类的语法更具可读性和易于编写;直接使用 SQLAlchemy 核心表不是我最喜欢的活动)。这一切都很好。

此时,我有 SQLAlchemy 结果行,但我需要将它们转换为通用 dicts,由于急切加载的关系可能会嵌套(在此环境中仅支持我的类型)。我不能使用 SQLAlchemy 的 ORM,因为 1)我没有engineor session;和 2) ORM 假设它可以在需要加载对象时访问数据库,这在 async/await FastAPI 应用程序中并非如此。

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

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

  1. 如何将列名称映射table_1_column_name到特定模型及其属性
  2. 如何检测和映射关系(可能不止一层)

感谢您的任何帮助,您可以提供!

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

4

3 回答 3

2

如果你是 db first,sqlalchemy 的 execute 方法通常会返回一个Result Proxy对象,你可以通过 fetchone、first、fetchall 等方法获取它的结果,然后将其转换为 list 或 dict。你也可以看到这个码头

于 2019-07-27T04:18:09.777 回答
0

SQLALchemy 对象有一个以 dict 形式返回的选项 - 这是帮助您的 SQLALchemy 源文档。 https://docs.sqlalchemy.org/en/13/orm/query.html#sqlalchemy.util.KeyedTuple._asdict

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

希望有帮助。

于 2019-11-28T18:40:04.440 回答
0

如果结果是原始 SQLAlchemy 行而不是 ORM 映射实例,则将对象转换为 dict应该可以工作。

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

于 2019-11-28T06:41:23.003 回答