Helpex - Trao đổi & giúp đỡ Đăng nhập

Flask 101: Lọc tìm kiếm và xóa dữ liệu

Đỗ Kim Long
· 02:00 17/12/2017
5 ngày trước

Lần trước chúng tôi có ứng dụng cơ sở dữ liệu âm nhạc dựa trên Flask của chúng tôi một phần chức năng. Bây giờ nó có thể thêm dữ liệu vào cơ sở dữ liệu, chỉnh sửa dữ liệu đã nói và cũng hiển thị mọi thứ trong cơ sở dữ liệu. Nhưng chúng tôi không đề cập đến cách lọc dữ liệu bằng cách sử dụng lựa chọn bộ lọc của người dùng (Tên nghệ sĩ, tên album hoặc tên nhà xuất bản) và chuỗi tìm kiếm. Chúng tôi cũng không đề cập đến cách xóa các mục khỏi cơ sở dữ liệu. Đó là mục tiêu hai lần của bài viết này.

Lọc kết quả tìm kiếm

Lọc kết quả tìm kiếm bằng SQLAlchemy (thông qua Flask-SQLAlchemy) thực sự khá dễ dàng. Tất cả bạn cần làm là tạo một số đối tượng truy vấn rất đơn giản. Mở tệp main.txt mà chúng tôi đã chỉnh sửa lần trước và thay thế hàm search_results () bằng phiên bản mã sau:

@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)

Ở đây chúng tôi đã thêm một câu lệnh if có điều kiện dài. Trước tiên chúng tôi kiểm tra xem người dùng đã nhập chuỗi tìm kiếm vào hộp văn bản tìm kiếm chưa. Nếu vậy, sau đó chúng tôi kiểm tra xem người dùng đã chọn bộ lọc nào từ hộp tổ hợp: Nghệ sĩ, Album hoặc Nhà xuất bản. Tùy thuộc vào lựa chọn của người dùng, chúng tôi tạo một truy vấn SQLAlchemy tùy chỉnh. Nếu người dùng không nhập cụm từ tìm kiếm hoặc nếu ứng dụng web của chúng tôi bị lẫn lộn và không nhận ra lựa chọn bộ lọc của người dùng, thì chúng tôi sẽ thực hiện truy vấn đối với cơ sở dữ liệu đầy đủ. Đây là điều có lẽ không nên thực hiện trong sản xuất vì nếu cơ sở dữ liệu thực sự lớn, thì việc thực hiện truy vấn đối với cơ sở dữ liệu của bạn sẽ khiến ứng dụng web của bạn không phản hồi. Bạn chỉ có thể thêm một số xác thực vào đầu vào của biểu mẫu để ngăn điều này xảy ra (nghĩa là không truy vấn cơ sở dữ liệu bằng chuỗi tìm kiếm trống). Tuy nhiên,

Dù sao, hãy tiếp tục và thử mã này và xem nó hoạt động như thế nào. Tôi đã thử một số thuật ngữ tìm kiếm khác nhau và nó có vẻ hoạt động tốt cho các trường hợp sử dụng của tôi. Bạn sẽ lưu ý rằng tôi chỉ đơn giản sử dụng phương thức chứa , rất phù hợp để tìm kiếm một chuỗi trong cột của bảng. Bạn luôn có thể lập chỉ mục cơ sở dữ liệu của mình và thực hiện các tối ưu hóa khác nhau cho cơ sở dữ liệu bao gồm làm cho các truy vấn này tập trung hơn rất nhiều nếu bạn muốn. Hãy chơi xung quanh với mã này và xem cách bạn có thể cải thiện nó.

Bây giờ chúng ta sẽ chuyển sang và tìm hiểu cách xóa các mục khỏi cơ sở dữ liệu!

Xóa dữ liệu

Có những lúc bạn nhập một cái gì đó vào cơ sở dữ liệu mà bạn chỉ muốn xóa. Về mặt kỹ thuật, bạn có thể sử dụng chức năng chỉnh sửa của chúng tôi để chỉ chỉnh sửa mục nhập thành bất cứ điều gì bạn muốn, nhưng đôi khi bạn chỉ cần lọc dữ liệu vĩnh viễn. Vì vậy, điều đầu tiên chúng ta cần làm là thêm một cột Xóa vào bảng kết quả. Bạn sẽ muốn mở các bảng xếp hạng và thêm một thể hiện LinkCol mới vào lớp Kết quả :

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'))

Giống như chúng tôi đã làm khi tạo liên kết để chỉnh sửa dữ liệu của mình, chúng tôi thêm một liên kết mới để xóa dữ liệu. Bạn sẽ lưu ý rằng đối số thứ hai, là điểm cuối, trỏ đến hàm xóa. Vì vậy, bước tiếp theo là mở tệp main.txt của chúng tôi và thêm chức năng xóa () đã nói :

@app.route('/delete/<int:id>', 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)</int:id>

Mã này thực sự khá giống với edit() chức năng của chúng tôi  từ bài viết trước. Bạn sẽ lưu ý rằng chúng tôi cập nhật các tuyến đường mặc dù. Vì vậy, thay vì chỉ định '/ item /' , chúng tôi đã tạo nó '/ xóa /' . Điều này làm cho các URL giữa hai chức năng khác nhau để chúng thực sự thực hiện đúng chức năng khi liên kết được nhấp vào. Sự khác biệt khác là chúng ta không cần tạo một chức năng tiết kiệm đặc biệt ở đây. Chúng tôi chỉ tham chiếu trực tiếp đối tượng db_session và yêu cầu nó xóa album nếu nó được tìm thấy trong cơ sở dữ liệu và sau đó cam kết các thay đổi của chúng tôi.

Nếu bạn chạy mã, bạn sẽ thấy một cái gì đó như sau khi thực hiện tìm kiếm chuỗi trống:

Flask 101: Lọc tìm kiếm và xóa dữ liệu

Điều cuối cùng chúng ta cần làm là tạo tệp xóa_album.html mà chúng ta đã tham chiếu ở trên. Hãy tạo tập tin đó và lưu nó vào thư mục mẫu của chúng tôi . Khi tệp đó được tạo, chỉ cần thêm vào như sau:

<doctype html="">
<title>Delete Album - Flask Music Database</title>
<h2>Delete Album</h2>

{% from "_formhelpers.html" import render_field %}
<form method="post">
    <dl>
        <span ng-non-bindable="">{{ render_field(form.artist) }}</span>
        <span ng-non-bindable="">{{ render_field(form.title) }}</span>
        <span ng-non-bindable="">{{ render_field(form.release_date) }}</span>
        <span ng-non-bindable="">{{ render_field(form.publisher) }}</span>
        <span ng-non-bindable="">{{ render_field(form.media_type) }}</span>
    </dl>
    <p><input type="submit" value="Delete">
</p></form></doctype>

Mã này sẽ hiển thị biểu mẫu của chúng tôi để hiển thị cho người dùng những gì họ đang xóa. Hãy thử nhấp vào liên kết xóa cho một trong các bản sao trong bảng của chúng tôi. Bạn sẽ thấy một màn hình như thế này xuất hiện:

Flask 101: Lọc tìm kiếm và xóa dữ liệu

Khi bạn nhấn nút Xóa, nó sẽ chuyển hướng bạn đến trang chủ nơi bạn sẽ thấy một thông báo rằng mục đó đã bị xóa thành công:

Flask 101: Lọc tìm kiếm và xóa dữ liệu

Để xác minh rằng việc xóa đã hoạt động, chỉ cần thực hiện một tìm kiếm chuỗi trống khác. Kết quả của bạn sẽ hiển thị một mục ít hơn trong bảng:

Flask 101: Lọc tìm kiếm và xóa dữ liệu

Kết thúc

Bây giờ bạn nên biết cách thực hiện một số bộ lọc cơ bản của kết quả tìm kiếm từ cơ sở dữ liệu. Bạn cũng đã học được cách xóa thành công các mục khỏi cơ sở dữ liệu trong ứng dụng Flask của mình. Có một số vị trí trong mã có thể sử dụng tái cấu trúc và dọn dẹp chung. Bạn cũng có thể thêm một số kiểu CSS vào ứng dụng của mình để làm cho nó trông đẹp hơn. Đó là những bài tập mà tôi sẽ để lại cho người đọc. Vui chơi xung quanh với mã và thử Flask. Đó là một khung web nhỏ gọn gàng và rất đáng xem!

Tải mã

Tải xuống một tarball của mã từ bài viết này: Vase_music_db_v.tar

Các bài viết khác trong sê-ri

  • Phần I - Flask 101: Bắt đầu
  • Phần II - Flask 101: Thêm cơ sở dữ liệu
  • Phần III - Flask 101: Cách thêm một mẫu tìm kiếm
  • Phần IV - Flask 101: Thêm, chỉnh sửa và hiển thị dữ liệu
1 hữu ích 0 bình luận 3.3k xem chia sẻ

Có thể bạn quan tâm