关于python:循环通过peewee导致烧瓶

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)

但是如何在表格中显示它呢?

这将逐个打印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}}