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

危险之爪

在长时间运行的 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 记录。我什至不确定在谷歌中搜索什么词来尝试解决这个问题......

我试过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

更新:

更新我到目前为止所发现的内容:实际上是两件事的组合使这件事发生:

  • filter_by(状态=0)

  • 项目.状态 = 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)
危险之爪

好的,虽然我还没有详细了解它为什么会这样,但至少现在我终于找到了解决问题所需的方法:

一旦每次迭代中的查询达到其目的(在我的情况下,从需要处理的数据库中获取第一个记录然后处理它),然后我需要调用以下内容: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 / Expiring

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法返回数据库查询结果

查询数据库时如何停止重复相同的代码

PHP 查询总是返回用户存在但直接对数据库运行相同的查询不会产生任何结果?

数据库查询不从值返回结果

Codeigniter:查询数据库返回多个结果

Firebase数据库查询返回错误结果

Android数据库查询未返回任何结果

查询不应该返回的结果 | 文档数据库

SQLite 数据库查询返回错误结果

从数据库查询别名结果与用户输入相同的数据库

重新排列数组中重复查询的数据库查询结果

对mysql数据库的结果重复功能

相同数据库的结果不同

为什么我的PHP同时循环重复相同的数据库结果?

Django重复数据库查询

查询SQlite生成的模型数据库并返回匹配的查询结果?

SQL结果重复:错误的查询拼写或不适当的数据库结构?

为什么查询结果重复?数据库服务器

Codeigniter显示数据库查询结果

显示数据库查询结果

两个看似相同的数据库如何返回按不同列排序的结果?

从自动增量数据库字段返回1

对于相同的sql查询,数据库需要不同的时间来返回响应

从方法返回LINQ数据库查询

数据库查询始终返回TRUE

代码点火器-如果查询结果返回行,如何更新数据库

ajax请求,查询数据库,json_encode,成功返回,显示结果

需要更改android studio数据库中的SQL查询以返回多个结果

C#Xamarin Android sqlite-pcl数据库。查询未返回任何结果