loop through peewee results in flask
基于此回复:
1 2 3 4 5 6 7
| cursor = db.execute_sql('select * from tweets;')
for row in cursor.fetchall():
print row
cursor = db.execute_sql('select count(*) from tweets;')
res = cursor.fetchone()
print 'Total: ', res[0] |
来自:python peewee execute_sql()示例
如何将其带到flask应用程序,然后显示在网页上?
是否正确:
模特儿
1 2 3 4
| def get_statistics():
cursor = finDB.execute_sql('CALL Allstatistics;')
for row in cursor.fetchall():
return row |
App.Py
1 2 3 4
| @app.route("/finance")
def finance():
stats = model.get_statistics()
return render_template('/finance.html', stats=stats) |
但是如何在表格中显示它呢?
- 要在HTML表中显示它们吗?,请显示统计数据的外观?统计是针对什么数据类型的?名单?字典?
- 是的,在html
中,当我直接在mysql中运行这个存储过程时,得到6列22行:text-55585.73-24834.28-2069.94-895.19空
- 结果的数据结构是什么?
- 我不知道…名单?
- 我显然不是…在我的peewee模型中:def get_tags(self):return tag_list.select(),从表中给我输出,然后在flask app.py中我只做output=model.get_tags(),然后在app route中:@app.route(……output=output…),然后在一个网页上,我可以使用列标题来循环访问,但这些都不适用于db.execute_sql()方法。
- 我觉得for row in cursor.fetchall(): return row不太合适。
- 这是@coliefer的其他回复,他设计的,所以应该知道最好的…
- @米哈尔的回答有一点不同,他回答说他循环中的行…您的函数应该是return所有行,但只返回第一行。
- @bgse,我注意到了这一点,但是如果我使用print而不是return,那么在加载page:typeerror时会出错:"nonetype"对象不可重复
- @Michal请参阅下面的答案,了解问题的根本原因。
问题在于你对以下内容的适应:
1 2
| for row in cursor.fetchall():
print row |
这将逐个打印fetchall()返回的所有行。
您试图将其调整为returning所有行的函数:
1 2 3 4
| def get_statistics():
cursor = finDB.execute_sql('CALL Allstatistics;')
for row in cursor.fetchall():
return row |
现在,这只会使return成为第一行,因为RETURN语句在第一次迭代时终止循环。
你真正想要的是这样的:
1 2 3
| def get_statistics():
cursor = finDB.execute_sql('CALL Allstatistics;')
return cursor.fetchall() |
这将正确返回光标中的所有行,如果没有结果行,则返回None。
通过检查是否有非空结果,而不是返回空列表的None,可以这样做:
1 2 3 4 5 6
| def get_statistics():
cursor = finDB.execute_sql('CALL Allstatistics;')
rows = cursor.fetchall()
if rows:
return rows
return [] |
对于cursor.fetchone(),这将返回光标的下一个可用行,如果没有更多行可用,则返回None。例如,您可以这样迭代光标中的所有可用行:
1 2 3 4 5 6
| rows = []
row = cursor.fetchone() # fetch first row, or None if empty result
while row is not None:
rows.append(row)
row = cursor.fetchone() # fetch the next row, if None loop terminates
return rows # return all collected results |
对于您的用例,为您的结果构建一个更方便的数据结构可能会很有趣,例如list of dicts:
1 2 3 4 5 6
| rows = []
row = cursor.fetchone()
while row is not None:
rows.append({'foo': row[0], 'bar': row[1], 'baz': row[2]})
row = cursor.fetchone()
return rows |
请注意,这可以类似地实现:
1 2 3 4
| rows = []
for row in cursor.fetchall():
rows.append({'foo': row[0], 'bar': row[1], 'baz': row[2]})
return rows |
然后,您可以在模板中编写循环for row in rows:
1
| foo is {{row['foo']}} and bar is {{row['bar']}} |
或者您可以构建一个namedtuple列表,允许您在模板中写入:
1
| foo is {{row.foo}} and bar is {{foo.bar}} |