为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2022-08-25 14:41:34
在长时间运行的 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: 1Item id: 1Item id: 1相反,我得到的是这个:Item id: 1Item id: 2Item id: 3我做错了什么?我不明白为什么当我甚至没有对表数据进行任何更新时,它会移动到NEXT记录。我甚至不确定在Google中搜索什么术语来尝试解决此问题...我尝试过在 上使用,但这似乎没有任何区别。flush()Session如果这很重要,这些是我正在使用的导入是:from flask import Flaskfrom sqlalchemy import create_enginefrom sqlalchemy.orm import scoped_sessionfrom sqlalchemy.orm import sessionmakerimport os, time, sys
查看完整描述

1 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

好吧,虽然我还没有读到为什么它表现成这样,但至少现在我终于找到了解决问题需要做些什么:


一旦每次迭代中的查询都实现了其目的(在我的情况下,从需要处理的数据库中获取第一条记录,然后对其进行处理),我接下来需要调用以下内容:并解决了我的问题。session.expire_all()


因此,在我上面的示例中,它现在应该如下所示:


def main():

    while True:

        item = Session.query(Queue).order_by(Queue.id.asc()).filter_by(status=0).first()

        if item:

            try:

                item.status = 1

                Session.commit()

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

                Session.expire_all() # <---- Add this line

            except:

                print('error')

        time.sleep(2)

这是SQLAlchemy文档中大致指向这个方向的部分:SQLAlchemy - Refreshing / Expireing


查看完整回答
反对 回复 2022-08-25
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号