Flask-SQLAlchemy会话对象没有看到数据库的更改?

问题描述 投票:0回答:2

我有一个关于PythonAnywhere的网站,它使用连接到MySQL数据库的Flask和Flask-SQLAlchemy。用户可以使用该网站将保存到数据库的任务排队为表中的记录,然后单独的计划任务(Python程序)检查数据库并处理每个未处理的记录。

我遇到的问题是,计划任务的db查询似乎只在第一次运行时才找到新记录,但如果我然后使用该网站添加新任务,则仍在运行的计划任务的重复数据库查询(似乎每隔5秒就没有检测到新记录。

关于这里可能发生什么的任何想法?

这是bash文件运行的代码:

def generate_any_pending_videos():
    unfinished_videos = db.session.query(Video)\
                                  .filter(~Video.status.has(VideoStatus.status.in_(['Error', 'Finished', 'Video deleted'])))\
                                  .order_by(Video.datetime_created)\
                                  .all()
    for video in unfinished_videos:
        try:
            logging.info("Attempting to create video for video %d" % video.id)
            generate_video(video)
        except Exception as e:
            logging.error(str(e))


if __name__ == '__main__':
    while True:
        generate_any_pending_videos()
        time.sleep(5)
python flask flask-sqlalchemy pythonanywhere
2个回答
3
投票

默认情况下,所有SqlAlchemy查询都在事务内运行http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html。这就是你在第一次调用脚本时才获得新数据的原因。因为在事务内部看到的数据不会改变,那就是我在ACID中,事务是孤立的。提交或回滚后,下一个查询将启动一个新事务,因此您将从数据库中获取新数据。


1
投票

找到了一个修复:出于某种原因,在我的查询运行之前运行db.session.commit()使新记录显示出来。

if __name__ == '__main__':
    while True:
        generate_any_pending_videos()
        time.sleep(5)
        db.session.commit()  # For some reason this is needed to be able to detect newly-created videos
© www.soinside.com 2019 - 2024. All rights reserved.