将SQLAlchemy ORM查询结果转换为JSON而非创建ORM对象

1 投票
1 回答
1714 浏览
提问于 2025-04-19 07:30

我正在为一家小企业开发一个网页应用,这个应用算是一种迷你企业资源计划(ERP)系统。这个网页应用是用AngularJS构建的,所以我主要用服务器端来管理数据库,并提供一个不错的REST API。

我很喜欢使用对象关系映射(ORM),这正好符合我的需求。我选择了SQLAlchemy作为我的数据库层,因为我觉得它使用起来非常简单方便(而且我也喜欢Python)。不过,当我使用SQLAlchemy的ORM层来查询一些实体(包括必要时的子实体)时,它会执行请求的查询(速度很快),但是每当获取到结果时,它会为每个结果创建一个Python对象,并且(据我理解)还要做很多工作来维护这些结果对象,让用户能够使用它们并保持与数据库的同步。然而,包装结果并创建SQLAlchemy实体(我想这在SQLAlchemy中叫做工作单元)是非常非常慢的(几千个结果需要几秒钟才能完成),而直接获取结果(以元组的形式)则非常快。

问题是,由于我在使用AngularJS,我只希望这些结果能直接转换成JSON,而不是先转换成Python对象,然后再做一堆不必要的工作。我真的很喜欢使用ORM,因为它帮助你管理嵌套查询和关系,但如果没有其他选择,我可能会退回到SQLAlchemy Core,但这样我就很难把结果解析成JSON对象(而且还要管理所有这些REST API的查询,其中一些是用户自定义的查询……毕竟这是一个管理系统)。SQLAlchemy的ORM已经处理了结果解析和生成查询,我只是希望它能创建JSON对象(实际上可以只是Python的字典和列表),而不是创建纯粹的Python对象。

有没有什么想法可以实现我想要的?

总结:

看标题。

1 个回答

2

如果你有幸使用比较新的PostgreSQL版本,你可以在服务器端直接使用一些新的JSON函数,比如row_to_json()函数:

 select row_to_json(mytable) from mytable

这个函数会把每一行数据转换成一种格式的字符串,像这样 '{"column":"value","column2":"value2"}'。然后你可以直接用SQLAlchemy Core把这些结果传到客户端,而不需要在Python中处理它们。

撰写回答