Рубрики
Без рубрики

Флэк 101: фильтрация поиска и удаление данных

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

В прошлый раз мы получили нашу функциональную функциональную функциональную приложение музыки на основе колбу. Теперь он может добавить данные в базу данных, редактировать указанные данные, а также отображать все в базе данных. Но мы не покрывали, как отфильтровать данные, используя выбор фильтра пользователя (артист, имя альбома или имени издателя) и строка поиска. Мы также не охватывали, как удалить элементы из базы данных. Это двукратная цель этой статьи.

Фильтрация результатов поиска

Фильтрующие результаты поиска с использованием SQLALCHEMY (через Flask-Sqlalchemy) на самом деле довольно легко. Все, что вам нужно сделать, это создать несколько очень простых объектов запроса. Откройте main.py файл, который мы редактировали в прошлый раз и замените search_results () Функция со следующей версией кода:

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

    if search_string:
        if search.data['select'] == 'Artist':
            qry = db_session.query(Album, Artist).filter(
                Artist.id==Album.artist_id).filter(
                    Artist.name.contains(search_string))
            results = [item[0] for item in qry.all()]
        elif search.data['select'] == 'Album':
            qry = db_session.query(Album).filter(
                Album.title.contains(search_string))
            results = qry.all()
        elif search.data['select'] == 'Publisher':
            qry = db_session.query(Album).filter(
                Album.publisher.contains(search_string))
            results = qry.all()
        else:
            qry = db_session.query(Album)
            results = qry.all()
    else:
        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)

Здесь мы добавили несколько длинный условный, если утверждение. Сначала мы проверяем, ввел ли пользователь в текстовом поле поиска в текстовом поле поиска. Если это так, то мы проверяем, на какой фильтр пользователь выбран из Combobox: Artist, альбом или издатель. В зависимости от выбора пользователя мы создаем пользовательский запрос SQLALCHEMY. Если пользователь не входит в систему поиска или если наше веб-приложение запутается, и не распознает выбор фильтра пользователя, затем мы выполняем запрос против полной базы данных. Это то, что, вероятно, не должно быть сделано в производстве, как если бы база данных приобретает действительно большая, то выполнение запроса против вашей базы данных в конечном итоге будет делать ваше веб-приложение без ответа. Вы можете просто добавить некоторую проверку на вход вашей формы, чтобы предотвратить это (то есть не запрашивать базу данных с пустой строкой поиска). Однако мы не будем прикрывать это здесь.

Во всяком случае, идите вперед и попробуйте этот код и посмотрите, как он работает. Я попробовал несколько разных условий поиска, и, казалось, работал нормально для моих случаев использования. Вы отметите, что я просто использовал Содержит метод Что отлично подходит для поиска строки в столбце стола. Вы всегда можете индексировать вашу базу данных и делать другие различные оптимизации, включая эти запросы намного более сосредоточены, если вы хотите. Не стесняйтесь играть с этим кодом и посмотреть, как вы можете улучшить его.

Теперь мы будем двигаться дальше и научиться удалять элементы из базы данных!

Удаление данных

Есть времена, когда вы вводите что-то в базу данных, которую вы просто хотите удалить. Технически вы можете использовать нашу функциональность редактирования, чтобы просто редактировать запись на все, что вы хотите, но иногда вам просто нужно постоянно очищать данные. Так что первое, что нам нужно сделать, это добавить Удалить столбец на наши результаты таблицы. Вы захотите открыть Tables.py и добавить новый Linkcol . Экземпляр к Результаты класс:

from flask_table import Table, Col, LinkCol

class Results(Table):
    id = Col('Id', show=False)
    artist = Col('Artist')
    title = Col('Title')
    release_date = Col('Release Date')
    publisher = Col('Publisher')
    media_type = Col('Media')
    edit = LinkCol('Edit', 'edit', url_kwargs=dict(id='id'))
    delete = LinkCol('Delete', 'delete', url_kwargs=dict(id='id'))

Так же, как мы сделали, когда мы создали ссылку для редактирования наших данных, мы добавляем новую ссылку для удаления данных. Вы отметите, что второй аргумент, который является конечной точкой, указывает на функцию удаления. Таким образом, следующий шаг – открыть наши main.py Файл и добавить сказал Удалить () Функция:

@app.route('/delete/', methods=['GET', 'POST'])
def delete(id):
    """
    Delete the item in the database that matches the specified
    id in the URL
    """
    qry = db_session.query(Album).filter(
        Album.id==id)
    album = qry.first()

    if album:
        form = AlbumForm(formdata=request.form, obj=album)
        if request.method == 'POST' and form.validate():
            # delete the item from the database
            db_session.delete(album)
            db_session.commit()

            flash('Album deleted successfully!')
            return redirect('/')
        return render_template('delete_album.html', form=form)
    else:
        return 'Error deleting #{id}'.format(id=id)

Этот код на самом деле довольно похож на нашу функцию редактирования () из последней статьи. Вы отметите, что мы обновили маршрут, хотя. Поэтому вместо указания ‘/item/ мы сделали это ‘/Удалить/ Отказ Это делает URL между двумя функциями, отличными, поэтому они фактически выполняют правильную функцию, когда ссылка нажата. Другое различие в том, что нам не нужно создавать специальную функцию сохранения здесь. Мы просто ссылаемся на db_session Объект напрямую и сообщите ему, чтобы удалить альбом, если он найден в базе данных, а затем совершить наши изменения.

Если вы запускаете код, вы должны увидеть что-то вроде следующего при выполнении пустой строки поиска:

Последнее, что нам нужно сделать, это создать delete_album.html что мы ссылались выше. Давайте создадим этот файл и сохранить его нашему Шаблоны папка. Как только этот файл создан, просто добавьте следующее:


Delete Album - Flask Music Database

Delete Album

{% from "_formhelpers.html" import render_field %}
{{ render_field(form.artist) }} {{ render_field(form.title) }} {{ render_field(form.release_date) }} {{ render_field(form.publisher) }} {{ render_field(form.media_type) }}

Этот код оказывает нашу форму, чтобы показать пользователю, что они удаляются. Попробуем нажать на ссылку Удалить для одного из дубликатов в нашем столе. Вы должны увидеть, как это появляется:

Когда вы нажимаете кнопку Удалить, она перенаправляет вас на домашнюю страницу, где вы увидите сообщение о том, что элемент был успешно удален:

Чтобы убедиться, что удаление работала, просто сделайте еще одну пустую строку поиска. Ваши результаты должны показывать один меньший элемент в таблице:

Обертывание

Теперь вы должны знать, как сделать базовую фильтрацию результатов поиска из базы данных. Вы также узнали, как успешно удалить элементы из базы данных в вашей колбе. Есть несколько мест в коде, которые могут использовать рефакторинг и общую очистку. Вы также можете добавить некоторые CSS Styling к вашему приложению, чтобы он выглядел красивее. Это упражнения, которые я уйду для читателя. Веселитесь, играя с кодом и давая колбу попробовать. Это аккуратная маленькая веб-каркас и стоит посмотреть!

Скачать код

Загрузите Тарбол кода из этой статьи: FLASK_MUSICDB_V.TAR

Другие статьи в серии

  • Часть I – Флэк 101: Начиная
  • Часть II – Флэк 101: Добавление базы данных
  • Часть III – Флэк 101: Как добавить форму поиска
  • Часть IV – Флэк 101: Добавление, редактирование и отображение данных