开发者社区> 问答> 正文

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

在长时间运行的while循环中,我试图检查与我的条件匹配的第一条记录,以便对其执行操作。出于简单的原因,下面从我的代码中删除了查询的过滤器方面,无论哪种方式,我都会遇到相同的问题)。

在下面的代码中:

 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中搜索哪个字词来尝试解决此问题...

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

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

from flask import Flask
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
import os, time, sys

更新:

更新到目前为止我发现的内容:实际上,这是两件事的结合:

  • filter_by(status=0)

  • item.status = 1

将过滤器添加到查询中,然后尝试更新记录状态列(例如,无论我是否实际将结果提交给数据库)

因此,如果我将这两个项目中的任何一个都取出,那么效果很好...但是我需要它们!

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}')
            except:
                print('error')
        time.sleep(2)

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 19:25:14 520 0
1 条回答
写回答
取消 提交回答
  • 好的,尽管我还没有完全读懂为什么会这样,但是至少现在我终于找到解决该问题所需要做的事情:

    一旦每次迭代中的查询都达到了目的(就我而言,从需要处理的数据库中获取第一条记录,然后对其进行处理),则需要调用以下命令: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-刷新/到期

    回答来源:stackoverflow

    2020-03-24 19:25:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载