我正在评估在异步/等待FastAPI应用中使用SQLAlchemy的潜在设置。我目前正在使用declarative_base
类编写模型和查询,然后使用Databases执行查询(对于模型类,语法更易读易写;直接使用SQLAlchemy核心表不是我的工作最喜欢的活动)。这一切都很好。
在这一点上,我有SQLAlchemy结果行,但是我需要将它们转换为通用dict,由于渴望加载关系而可能嵌套(仅在此环境中我将支持的类型)。我不能使用SQLAlchemy的ORM,因为1)我没有engine
或session
;和2)ORM假定只要需要将其加载到对象中就可以访问数据库,而在异步/等待FastAPI应用程序中则不是这种情况。
有人对实现此目标有想法或指示吗?我正在努力弄清楚如何将结果行与特定的关系键相关联。我一直在研究SQLAlchemy内部的想法,但是它很不透明,因为其中很多都假设我的设置中没有出现整个对象缓存和会话/引擎管理层。
我可以使用以下两个想法:
table_1_column_name
之类的列名映射到特定模型及其属性感谢您提供的任何帮助!
更新:您可以在此处找到一个可运行的示例:https://gist.github.com/onecrayon/dd4803a5099061fa48d52f2d4bc2396b(有关第92-109行的相关位置,我需要弄清楚如何将RowProxy转换为嵌套dict通过将查询列名称映射到SQLAlchemy模型上的名称)。
答案 0 :(得分:0)
如果您首先是数据库,则sqlalchemy execute方法通常会返回一个 Result Proxy 对象,您可以使用其方法(例如fetchone,first,fetchall)获取其结果,然后将其强制转换为list或字典 您还可以看到this dock
答案 1 :(得分:0)
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的包装器。
希望有帮助。