Sqlalchemy查询执行后正在被修改



我试图建立一个flask应用程序的消息系统。消息存储在数据库中。每个条目都有一个"已查看"。或";Unviewed"财产。我希望未查看的消息在页面上的显示方式与已查看的不同。逻辑如下。当创建消息时,它获得的值为"未查看"。一旦用户转到消息页面,所有未查看的消息都将使用已查看的值进行更新,以便下次用户转到该页面时,它们将被读取为已查看的消息。问题是,我查询未查看的消息并存储到一个变量,以便在我提交从已查看到未查看的更改之前传递给前端。但是当我返回未查看消息的变量时,它是空的,这表明所有消息都被查看了。代码如下:

@app.route("/messages", methods=['GET', 'POST'])
@login_required
def message_logs():
unviewed_messages = Messages.query.filter(Messages.username==current_user.username).filter(Messages.viewed=='Unviewed')
viewed_messages = Messages.query.filter(Messages.username==current_user.username).filter(Messages.viewed=='Viewed')
read_messages = Messages.query.filter_by(username=current_user.username).update({Messages.viewed : 'Viewed'})
db.session.commit()
return render_template('messages.html', title='messages', viewed_messages=viewed_messages, unviewed_messages=unviewed_messages)

如果我在查询特定未读行ID的未查看消息变量下面放一条print语句,它将成功打印ID,证明在代码中此时消息仍然未读。然而,unviewed_messages"应该包含这些未查看消息的变量返回空到前端。我的理论是,变量只是存储查询,而不是实际执行它,它是稍后执行,在"Viewed"已经更新了未查看的行。有人知道这是为什么吗?或者如果是别的什么,有人能解释一下我错过了什么吗?由于

未查看和已查看的查询将不会执行,直到呈现模板,这是在提交更新之后。您可以在此之前通过对它们调用.all()来执行它们,但这没有帮助,因为结果对象将在提交时过期。这意味着如果在提交之后被访问,它们的状态将从数据库中重新加载。

你的选择是:

  • 创建expire_on_commit=False的会话。您可以在db = SQLAlchemy(app, session_options={'expire_on_commit': False})中这样做,但要注意这是一个全局更改。
  • 在提交之前执行查询,然后将所需的值加载到字典或类似列表中,并让模板使用该列表。
  • 通过在一个请求中更新而在另一个请求中查询来保持命令-查询分离。