python - 如何通过sqlalchemy从APScheduler获取最新数据?

标签 python sqlalchemy apscheduler

我尝试使用 Advanced Python Scheduler 通过 Flask sqlalchemy 每五秒从 MySql 数据库获取数据一次。

就我而言,我想通过Flask SQLAlchemy从APScheduler获取最新修改的数据,但是当我多次更改MySql数据库中的数据后,我仍然获取数据库中最早的数据。

看起来 APScheduler 只运行该作业一次,在接下来的时间里它只是“记住”并“复制”它所做的事情。 以下是APScheduler的相关设置。

jobstores={"default":MemoryJobStore(),}
executors={"threadpool":ThreadPoolExecutor(max_workers=20)}
job_default={
    'coalesce': True,
    'max_instances': 1,
    'replace_existing':True
}
scheduler=BackgroundScheduler(jobstores=jobstores,executors=executors,job_default=job_default)

def testJob():
    test=Test.query.filter_by(id=2).first()
    with open('test.log','a+') as f:
        s=str(datetime.now())+'  '+str(test)+'\n'
        f.writelines([s])

tmpL=[CronTrigger(minute=m,second=s) for m in range(60) for s in range(0,60,5)]
tmpL.append(DateTrigger(run_date=datetime.now()))
trigger=OrTrigger(tmpL)
job=scheduler.add_job(testJob,trigger,id="testJob",replace_existing=True)
scheduler.start()

在我的测试中,我的表首先包含数据“cat 4”,然后我将其更改为“dog 3”,“orange 7”等。我什至删除了那行数据。但我只能每五秒得到一次“Test 2:cat->4”。

enter image description here

如何通过sqlalchemy从APScheduler获取最新数据?

最佳答案

您的调度程序可能使用单个线程来运行作业,因为它们非常罕见。从 Test.query 来看,您可能正在使用 Flask-SQLAlchemy,它默认使用作用域 session ,或者换句话说,线程本地 session 。您的作业也不会结束由查询隐式启动的事务。这些与使用默认为 REPEATABLE READ 事务隔离级别的 MySQL 相结合,导致作业共享相同的事务,因此从数据库的相同快照读取。只需及时结束您的交易即可:

def testJob():
    test=Test.query.filter_by(id=2).first()
    db.session.rollback()
    ...

关于python - 如何通过sqlalchemy从APScheduler获取最新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54491567/

相关文章:

python - 如何在Pytorch中形成一个连续的数字序列?

python - 尝试从 iPython 运行脚本时出现语法错误

python - sqlite 列中有多个元素

python - 使 collat​​z 程序自动化无聊的事情

python - 如何检查 apscheduler 是否在后台运行

python - sqlalchemy:在列上调用 STR_TO_DATE

python - SQLAlchemy:具有关系的混合表达式

python - 运行迁移时出错 : sqlalchemy. exc.CompileError: Postgresql ENUM 类型需要一个名称

Python Apscheduler - 动态调度作业(嵌套)

python - APScheduler 作业未按计划启动