Sqlite формат вывода в python - PullRequest
1 голос
/ 01 мая 2020

У меня есть простое flask веб-приложение, в котором пользователь может добавлять и удалять задачи из базы данных. Все записи в базе данных отображаются в виде шаблона, отсортированного по назначенному типу. Я не могу отформатировать вывод, чтобы он был хотя бы несколько читабельным. Как я могу это сделать?

Фактическая база данных использует разные значения и еще много чего, поэтому не все из них могут иметь смысл прямо сейчас.

Эта функция получает все записи из моей базы данных sqlite:

def get_tsk_by_type(type):
  c.execute("SELECT * FROM tasks WHERE type=:type", {'type': type})
  result = c.fetchall()
  return result

База данных:

c.execute("""CREATE TABLE IF NOT EXISTS tasks (
            type text,
            description text,
            amount integer,
            id integer
            )""")

И вот как я возвращаю все записи, которые затем отображаются в шаблоне. Существует также функция удаления задач, если вы вводите их идентификатор.

@app.route('/', methods = ['GET', 'POST'])
def index():
  form = DeleteForm()
  curr_homework = str(get_tsk_by_type("homework"))
  curr_cleaning = str(get_tsk_by_type("cleaning"))
  curr_cooking = str(get_tsk_by_type("cooking"))
  if form.validate_on_submit():
    try:
      conn = sqlite3.connect('tasks.db', check_same_thread=False)
      c = conn.cursor()
      delete = request.form['delete']
      if (delete):
        remove_tsk(delete)
      return redirect('/')
      conn.close()
    except:
      return "Something went wrong while submitting the form"
  return render_template('index.html', curr_homework = curr_homwork, curr_cleaning = curr_cleaning, curr_cooking = curr_cooking, form = form)

Соответствующие части моего индекса. html выглядят так:

{% block content %}
    <div>
        <p>
            <span>Currently registered homework: {{ curr_homework }}</span><br />
            <span>Currently registered cleaning tasks: {{ curr_cleaning }}</span><br />
            <span>Currently registered cooking tasks {{ curr_cooking }}</span>
        </p>
    </div>
{% endblock content %}

Однако вывод я выгляжу так:

Currently registered homework: [('homework', 'math', 1, 'df19c0b1-a2128-431274-2e32-3a2f901b1b26')]
Currently registered cleaning tasks: [('cleaning', 'kitchen', 1, 'df19c0b1-aa18-4874-9e32-3a2f901b1b26')]
Currently registered cooking tasks: [('cooking', 'lunch', 1, '0697c139-0299-4c93-88ac-c07d77377796')]

Я пробовал циклы for и тому подобное, но он возвращает только первый кортеж в списке, который возвращает get_tsk_by_type (). Я также пробовал панду, но я не мог заставить ее выводить так, как я хочу. Как мне сделать так, чтобы он был легко читаем? Без скобок et c.? Позже я хочу отобразить каждую отдельную задачу отдельно, желательно в div.

1 Ответ

0 голосов
/ 01 мая 2020

Я рекомендую использовать диктовый курсор, чтобы вы могли получить доступ к элементам результата по имени.
Вы можете сделать это следующим образом (из: { ссылка }):

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

conn.row_factory = dict_factory

Тогда вы получите такой результат:

result = c.fetchall()
result
# [{'type':'homework','description':'math',
#   'amount':1,'id':'df19c0b1-a2128-431274-2e32-3a2f901b1b26'}]

Тогда в вашем шаблоне вы можете сделать что-то вроде:

  {% for homework in curr_homework %}
    <div>
      <h6>{{ homework['type'] }}</h6>
      <div>{{ homework['description'] }}</div>
    </div>
    {% if not loop.last %}
      <hr>
    {% endif %}
  {% endfor %}

Вы можете получить немного -организация базы данных с указанием c кода.
Вы можете сделать это:

from flask import g

def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

def get_db():
    if 'db' not in g:
        conn = sqlite3.connect('tasks.db', check_same_thread=False)
        conn.row_factory = dict_factory
        g.db = conn.cursor()
    return g.db

А затем, на ваш взгляд, сделать это:

db = get_db()
db.execute('your query here')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...