Цикл через 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}}