Flask 对象作为SQL文本值不合法

Flask 对象作为SQL文本值不合法,flask,sqlalchemy,Flask,Sqlalchemy,长期读者,第一次海报,请温柔 我一直在使用Flask和SQLAlchemy开发一个web应用程序,允许用户查看和评论MMA比赛。我在一个SQL表中有一个名为“fights”的战斗列表,我正试图使用动态路由来过滤数据。我有一份一条路线上所有战斗的列表,如下所示: @app.route('/ufc251') @login_required def ufc251(): return render_template('ufc251.html', fights=Fi

长期读者,第一次海报,请温柔

我一直在使用Flask和SQLAlchemy开发一个web应用程序,允许用户查看和评论MMA比赛。我在一个SQL表中有一个名为“fights”的战斗列表,我正试图使用动态路由来过滤数据。我有一份一条路线上所有战斗的列表,如下所示:

    @app.route('/ufc251')
    @login_required
    def ufc251():
        return render_template('ufc251.html', fights=Fight.query.all())
这帮助我制作了一个光滑的页面,列出了所有的格斗,然后又制作了另一条路线来获取个人格斗的信息,如:

     @app.route('/fight/<int:id>')
     @login_required
     def fight(id):
         id = Fight.query.filter_by(id=id).first_or_404()
         return render_template('fight.html')
@app.route(“/fight/”)
@需要登录
def战斗(id):
id=Fight.query.filter\u by(id=id).first\u或\u 404()
返回render_模板('fight.html')
到目前为止,一切顺利。如果我点击主页上的一场战斗,我会被发送到一个url fightsite/fights/,这很完美。我面临的问题是,我一辈子都无法想出如何在一次战斗中调用行中的数据。如果我将路线更改为:

    @app.route('/fight/<int:id>')
    @login_required
    def fight(id):
         id = Fight.query.filter_by(id=id).first_or_404()
         return render_template('fight.html', fight=Fight.query.filter_by(id=id).first())
@app.route(“/fight/”)
@需要登录
def战斗(id):
id=Fight.query.filter\u by(id=id).first\u或\u 404()
返回render_模板('fight.html',fight=fight.query.filter_by(id=id.first())
我得到了错误

sqlalchemy.exc.ArgumentError:对象作为SQL文本值不合法

但是如果我给id一个值(即id=1),它将显示表中第一行的数据,所以我觉得问题出在(id=id)部分,但在搜索了数小时的互联网之后,我似乎找不到解决方案

任何帮助都将不胜感激。是的,我读过关于这个主题的另一篇StackOverflow文章,但是答案似乎不适用于这种情况


提前谢谢你

我知道了,但是我决定留下这个问题,以防其他人有这个问题

我改变了:

    @app.route('/fight/<int:id>')
    @login_required
    def fight(id):
       id = Fight.query.filter_by(id=id).first_or_404()
       return render_template('fight.html', fight=Fight.query.filter_by(id=id).first())
@app.route(“/fight/”)
@需要登录
def战斗(id):
id=Fight.query.filter\u by(id=id).first\u或\u 404()
返回render_模板('fight.html',fight=fight.query.filter_by(id=id.first())
致:

@app.route(“/fight/”)
@需要登录
def战斗(id):
id=Fight.query.filter\u by(id=id).first\u或\u 404()
返回render_模板('fight.html',fight=fight.query.filter_by(id=id.id).first())

因为最初它传递的是参数“fight_1”,而不仅仅是“1”。我希望没有其他人要花这么长时间来解决同样的问题

使用
id
来举行一场战斗会使事情变得混乱。然后是双重查询,一个就足够了

考虑改变

 id = Fight.query.filter_by(id=id).first_or_404()
 return render_template('fight.html', fight=Fight.query.filter_by(id=id).first())

 id = Fight.query.filter_by(id=id).first_or_404()
 return render_template('fight.html', fight=Fight.query.filter_by(id=id).first())
fight = Fight.query.filter_by(id=id).first_or_404()
return render_template('fight.html', fight=fight)