результаты sqlite-запроса не отображаются в веб-приложении «Фляга» - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь изучать колбу, поэтому решил следовать этому уроку:

https://www.blog.pythonlibrary.org/2017/12/14/flask-101-adding-editing-and-displaying-data/

Я только что обновил свою основную функцию следующим образом:

@app.route('/results')
def search_results(search):
    results = []
    search_string = search.data['search']

    if search.data['search'] == '':
        qry = db_session.query(Album)
        results = qry.all()

    if not results:
        flash('No results found!')
        return redirect('/')
    else:
        # display results
        table = Results(results)
        table.border = True
        return render_template('results.html', table=table)

но когда я добавляю альбом в БД и пытаюсь запросить его обратно, используя опцию поиска, он говорит, что результатов нет.Файл БД был создан правильно, и у меня точно такой же код, что и в учебном пособии до этого момента.

Единственное изменение, которое я сделал, было добавление из таблиц результатов импорта.Полный main.py ниже.Не могли бы вы дать мне несколько советов о том, где искать виновника?Как я уже сказал, просто учусь, поэтому любые предложения относительно ресурсов в дружественном порядке будут высоко оценены (начинающий программист).

from app import app
from db_setup import init_db, db_session
from forms import MusicSearchForm, AlbumForm
from flask import flash, render_template, request, redirect
from models import Album, Artist
from tables import Results 

init_db()


def save_changes(album, form, new=False):
    """
    Save the changes to the database
    """
    # Get data from form and assign it to the correct attributes
    # of the SQLAlchemy table object
    artist = Artist()
    artist.name = form.artist.data

    album.artist = artist
    album.title = form.title.data
    album.release_date = form.release_date.data
    album.publisher = form.publisher.data
    album.media_type = form.media_type.data

    if new:
        # Add the new album to the database
        db_session.add(album)

    # commit the data to the database
    db_session.commit()


@app.route('/', methods=['GET', 'POST'])
def index():
    search = MusicSearchForm(request.form)
    if request.method == 'POST':
        return search_results(search)

    return render_template('index.html', form=search)


@app.route('/results')
def search_results(search):
    results = []
    search_string = search.data['search']

    if search.data['search'] == '':
        qry = db_session.query(Album)
        results = qry.all()

    if not results:
        flash('No results found!')
        return redirect('/')
    else:
        # display results
        table = Results(results)
        table.border = True
        return render_template('results.html', table=table)


@app.route('/new_album', methods=['GET', 'POST'])
def new_album():
    """
    Add a new album
    """
    form = AlbumForm(request.form)

    if request.method == 'POST' and form.validate():
        # save the album
        album = Album()
        save_changes(album, form, new=True)
        flash('Album created successfully!')
        return redirect('/')

    return render_template('new_album.html', form=form)


if __name__ == '__main__':
    app.run()

1 Ответ

0 голосов
/ 23 февраля 2019

Нет сомнений, что вы уже засыпали свой исходный код заявлениями print() и ничего не нашли.Кэшированные строки в модели БД могут быть аспектом, который трудно понять здесь, и регистрация вызовов sqlite пролила бы свет на это.

Используйте это:

import logging

logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

Это шумно, ноон покажет, когда строки попадают во внутреннюю БД и когда они извлекаются.

Привыкайте многократно выдавать отладочные запросы, подобные этим, чтобы вы точно знали, что было сохранено:

$ echo 'select * from album;' | sqlite3 music.db

Для повторного тестирования может быть удобно скопировать файл базы данных в папку резервной копии, а затем cp этот фиксированный снимок поверх активного файла перед каждым запуском теста.Важно, чтобы после такого копирования работающее приложение фляги было перезапущено.Установка FLASK_DEBUG=1 может помочь в этом.

Также, jeverling предлагает с использованием SQLAlchemyDebugPanel.

...