重复相同的数据库查询将返回增量结果

在长时间运行的 while 循环中,我正在尝试检查与我的标准匹配的第 1 条记录,以便对其执行操作。出于简单起见,查询的筛选器方面已从下面的代码中删除,无论哪种方式,我都会遇到相同的问题)。


在下面的代码段中:


 while True:

    time.sleep(2)

    item = Session.query(Model).order_by(Model.id.asc()).first()

    print(f'Item id: {item.id}')

作为输出,我想实现的是:


Item id: 1

Item id: 1

Item id: 1

相反,我得到的是这个:


Item id: 1

Item id: 2

Item id: 3

我做错了什么?我不明白为什么当我甚至没有对表数据进行任何更新时,它会移动到NEXT记录。我甚至不确定在Google中搜索什么术语来尝试解决此问题...


我尝试过在 上使用,但这似乎没有任何区别。flush()Session


如果这很重要,这些是我正在使用的导入是:


from flask import Flask

from sqlalchemy import create_engine

from sqlalchemy.orm import scoped_session

from sqlalchemy.orm import sessionmaker

import os, time, sys


元芳怎么了
浏览 96回答 1
1回答

皈依舞

好吧,虽然我还没有读到为什么它表现成这样,但至少现在我终于找到了解决问题需要做些什么:一旦每次迭代中的查询都实现了其目的(在我的情况下,从需要处理的数据库中获取第一条记录,然后对其进行处理),我接下来需要调用以下内容:并解决了我的问题。session.expire_all()因此,在我上面的示例中,它现在应该如下所示:def main():&nbsp; &nbsp; while True:&nbsp; &nbsp; &nbsp; &nbsp; item = Session.query(Queue).order_by(Queue.id.asc()).filter_by(status=0).first()&nbsp; &nbsp; &nbsp; &nbsp; if item:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; item.status = 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Session.commit()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print(f'Item id: {item.id}')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Session.expire_all() # <---- Add this line&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; except:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print('error')&nbsp; &nbsp; &nbsp; &nbsp; time.sleep(2)这是SQLAlchemy文档中大致指向这个方向的部分:SQLAlchemy - Refreshing / Expireing
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python