【问题标题】:Repeating same database query returns incremental results重复相同的数据库查询返回增量结果
【发布时间】:2020-03-10 22:20:58
【问题描述】:

在一个长时间运行的 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

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

所以,如果我取出这 2 件物品中的任何一件,它都可以正常工作……但我需要它们!

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)

【问题讨论】:

标签: python python-3.x flask sqlalchemy


【解决方案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 - Refreshing / Expiring

【讨论】:

    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2014-07-06
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多