繁体   English   中英

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

[英]How can I get the latest data from APScheduler through sqlalchemy?

我尝试使用Advanced Python Scheduler每隔五秒通过烧瓶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”。

在此处输入图片说明

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

您的调度程序可能只使用一个线程来运行作业,因为它们很少。 Test.query ,您似乎正在使用Flask-SQLAlchemy,默认情况下使用的是作用域会话,或者换句话说,是线程本地会话。 您的工作也不会结束查询隐式启动的事务。 这些与结合使用默认为REPEATABLE READ事务隔离级别的MySQL的结果是,作业共享同一事务,因此从数据库的同一快照中进行读取。 只需及时结束交易:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM