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()