python - Select 语句仅返回结果中的第一行

标签 python sqlalchemy flask-sqlalchemy

我有以下代码:

@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 循环上,因为它没有迭代足够的次数来获取其余数据,但是我不确定修复会看到结果是一个对象。

附注如果这可以通过 ORM 方法完成,我也洗耳恭听。我决定使用 SQL,因为我无法让 ORM 模型选择正确的数据。

最佳答案

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

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

对于大多数用途,无需显式转换 RowProxy结果的实例到 dict,因为它们本身充当有序映射。一个值得注意的异常(exception)是序列化为 JSON,因为 json 模块不知道如何处理 SQLAlchemy 行代理。

关于python - Select 语句仅返回结果中的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55114469/

相关文章:

python - Pygame 碰撞错误

filter - 为 sqlalchemy 查询预过滤用户访问权限的最佳方法是什么?

Python/SQLAlchemy : Event Listeners after_flush fires for decimal values, 即使值没有改变

python - Flask-Admin:将自定义属性添加到 column_list

python - Flask/SQLAlchemy : Incompatible collection type: None is not list-like

python - 在 urllib2 中发出 GET 请求和欺骗用户代理时出现问题

python - 如何在 Python 中使用 Plotly 将饼图绘制为具有自定义大小的子图

python - 训练集的不同 MSE 结果

python-3.x - Geoalchemy2 在给定坐标内查找一定距离内的位置

python - Flask Alchemy with Marshmallow 返回空 JSON