首页 > 解决方案 > 选择语句仅返回结果中的第一行

问题描述

我有以下代码:

@staticmethod
def get_all_locations_for_event(value):
   sql = text('SELECT * \
   FROM public.location_event \
   INNER JOIN public.location \
   ON public.location_event.location_id = public.location.id \
   WHERE event_id = :x;')
   result = db.engine.execute(sql, x = value)
   for r in result:
      dict_ = dict(r)
   return dict_

它只返回第一行。但是我希望它返回所有结果。我是 SQL-Alchemy 的新手,所以如果我遗漏了什么,请原谅我。过去几个小时我在网上搜索过,到目前为止,我只遇到过返回单行而不是多行的代码示例。

我知道问题出在 for 循环上,因为它没有足够的迭代次数来获取其余数据,但是我不确定修复会看到什么结果是一个对象。

PS 如果这可以用 ORM 方法完成,我也全神贯注。我决定使用 SQL,因为我无法让我的 ORM 模型选择正确的数据。

标签: pythonsqlalchemyflask-sqlalchemy

解决方案


您的 for 循环迭代的次数恰到好处,但在其主体中,您反复将名称重新绑定dict_到新dict实例,因此您的函数返回查询产生的最后一个结果。相反,您需要返回一个列表,或者将您的函数转换为生成器:

def get_all_locations_for_event(value):
    ...
    result = db.engine.execute(sql, x = value)
    return result.fetchall()

对于大多数目的,不需要将RowProxy结果的实例显式转换为dict,因为它们自己充当有序映射。一个值得注意的例外是序列化为 JSON,因为该json模块不知道如何处理 SQLAlchemy 行代理。


推荐阅读