在长时间运行的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
好的,尽管我还没有完全读懂为什么会这样,但是至少现在我终于找到解决该问题所需要做的事情:
一旦每次迭代中的查询都达到了目的(就我而言,从需要处理的数据库中获取第一条记录,然后对其进行处理),则需要调用以下命令: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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。