在长时间运行的 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] 删除。
我来说两句