【发布时间】: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)
【问题讨论】:
-
请提供minimal reproducible example,强调可重现。
-
@Ilja Everilä 我添加了实际调用的函数以及一些额外的发现
标签: python python-3.x flask sqlalchemy