Цикл через peewee результаты в колбе

На основании этого ответа:

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 () пример

как перенести его в приложение фляги, а затем отобразить на веб-странице?

это правильно:

model.py

def get_statistics():
        cursor = finDB.execute_sql('CALL Allstatistics;')
        for row in cursor.fetchall():
                return row

app.py

@app.route("/finance")
def finance():
        stats = model.get_statistics()
        return render_template('/finance.html', stats=stats)

но как отобразить это в таблице?

1 ответ

Решение

Проблема заключается в вашей адаптации:

for row in cursor.fetchall():
    print row

Это напечатает все строки, возвращенные fetchall(), по одному.

Вы пытались адаптировать это в функцию returning все строки:

def get_statistics():
    cursor = finDB.execute_sql('CALL Allstatistics;')
    for row in cursor.fetchall():
        return row

Теперь это будет return только первая строка, поскольку оператор return завершает ваш цикл на первой итерации.

То, что вы действительно хотите, это что-то вроде этого:

def get_statistics():
    cursor = finDB.execute_sql('CALL Allstatistics;')
    return cursor.fetchall()

Это будет правильно возвращать все строки в курсоре, или None если нет строк результата.

С проверкой, есть ли непустой результат, и вместо None возвращая пустой список, вы можете сделать это следующим образом:

def get_statistics():
    cursor = finDB.execute_sql('CALL Allstatistics;')
    rows = cursor.fetchall()
    if rows:
        return rows
    return []

относительно cursor.fetchone(), это вернет следующую доступную строку курсора, или None если больше нет доступных строк. Например, вы можете перебрать все доступные строки в вашем курсоре следующим образом:

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:

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

Обратите внимание, что это может быть достигнуто аналогичным образом, как это:

rows = []
for row in cursor.fetchall():
    rows.append({'foo': row[0], 'bar': row[1], 'baz': row[2]})
return rows

Затем вы можете написать в своем шаблоне, цикл for row in rows:

foo is {{row['foo']}} and bar is {{row['bar']}}

Или вы могли бы составить список namedtuple, что позволяет писать в шаблоне:

foo is {{row.foo}} and bar is {{foo.bar}}
Другие вопросы по тегам