Python Select语句只返回结果中的第一行

Python Select语句只返回结果中的第一行,python,sqlalchemy,flask-sqlalchemy,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

我有以下代码:

@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炼金术新手,所以如果我遗漏了什么,请原谅我。我在网上搜索了几个小时,到目前为止,我只看到返回一行而不是多行的代码示例

我知道问题在于for循环,因为它没有足够的迭代次数来获取其余的数据,但是我不确定修复程序看到的结果是对象


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

我认为问题在于for循环,这是对的。现在还不清楚你打算做什么,但目前,每次迭代都会覆盖它。dict_uu将保存最终迭代结果的值,然后退出

如果我没有弄错,您的结果已经是一个属性化对象(如果我在这一点上错了,请纠正我),即您应该能够通过点符号访问相应的数据库列。因此,您应该能够循环浏览以下项目:

示例

dict_ = []

for r in result:
    id = r.id
    name = r.name
    dict_.append((id,name))

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

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

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

我猜您可以这样做(未经测试,取决于您的模型):


Join需要相关的外键

如果没有您的型号,我们无法安装ORM解决方案。谢谢,我将在另一个问题中问您这个问题!这正是我需要的。工作得很好!
Location.join(LocationEvent).filter_by(event_id=**value**).all()