代码之家  ›  专栏  ›  技术社区  ›  Bartek Malysz

Flask Web App中未显示SQLite查询结果

  •  0
  • Bartek Malysz  · 技术社区  · 5 年前

    我正在尝试学习烧瓶,所以决定遵循本教程:

    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)
    

    但是当我向数据库中添加一个相册并尝试使用search选项查询它时,它会说没有结果。数据库文件是正确创建的,到目前为止,我拥有与教程中完全相同的代码。

    我做的唯一更改是从表中添加导入结果。下面是完整的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()
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   J_H    5 年前

    毫无疑问,您已经在源代码中添加了 print() 没有发现任何有启发性的东西。在这里,db模型中缓存的行可能是很难理解的方面,而记录sqlite调用将揭示这一点。

    使用此:

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

    这很吵,但它会显示行何时到达后端数据库以及何时检索它们。

    养成这样反复发出调试查询的习惯,这样就可以确定哪些查询被持久化了:

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

    对于可重复测试,可以方便地将数据库文件复制到备份位置,然后 cp 在每次测试运行之前,在活动文件顶部冻结的快照。在复制之后重新启动运行的flask应用程序是很重要的。设置 FLASK_DEBUG=1 可以帮上忙。

    也, jeverling suggests 使用SqlAlchemyDebugPanel。