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

时间:2014-09-02 02:34:57

标签: python orm sqlalchemy

我正在为小型企业构建一个webapp,它应该是某种小型ERP。 webapp是使用AngularJS构建的,所以我主要使用服务器端来管理数据库并提供一个很好的REST api。

我非常喜欢与ORM合作,它确实符合我的需求。我选择SQLAlchemy作为我的数据库层,因为我发现它非常容易和方便(我也喜欢Python)。但是,当使用SQLAlchemy的ORM层,并且您想要查询某些实体的结果(包括必要时的子项)时,它会执行所请求的查询(这非常快),但是,只要它获得结果,它就会创建一个Python每个结果的对象,以及(据我的理解),维护这些结果对象的许多工作,允许用户使用它们并使它们与数据库保持同步。但是,包装结果并创建SQLAlchemy实体(我认为它在SQLAlchemy中称为工作单元)非常非常慢(几千个结果需要几秒钟才能完成),而不是仅仅获得结果(在元组中)非常快。

事实上,因为我使用的是AngularJS,所以我想要的是将这些结果转换为JSON,而不是先将它们转换为Python对象并进行大量不必要的工作。 我非常喜欢使用ORM,因为它可以帮助您管理嵌套查询和关系,但是如果我没有选择,我可能会回到SQLAlchemy Core,但是我要解析结果会很困难进入JSON对象(并管理REST apis的所有查询,其中一些将是用户构建的自定义查询......毕竟它是一个管理系统......)。 SQLAlchemy的ORM已经完成了解析和生成查询的结果,我只想创建JSON对象(实际上可以只是Python的字典和列表),而不是创建纯Python对象。

想法如何实现我的目标?

TL; DR

阅读标题。

1 个答案:

答案 0 :(得分:2)

如果您有幸使用最新的PostgreSQL,您可以在服务器端使用recent JSON functions,例如row_to_json()功能:

 select row_to_json(mytable) from mytable

将每行返回为格式的字符串' {"列":"值","列2":" value2& #34;}&#39 ;.然后,您可以使用SQLAlchemy Core直接将结果行迭代到客户端,而无需在Python中触及它们。