Как я могу получить последние данные из APScheduler через sqlalchemy? - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь использовать Advanced Python Scheduler для получения данных из моей базы данных MySql через sqlalchemy во флаконе раз в пять секунд.

Насколько мне известно, я хочу получать последние измененные данные из APScheduler черезНастроить SQLAlchemy, но после того, как я несколько раз изменил данные в базе данных 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" и так далее.Я даже удаляю эту строку данных.Но я могу получать «Тест 2: cat-> 4» каждые пять секунд.

введите описание изображения здесь

Как я могу получить последние данные из APSchedulerчерез sqlalchemy?

1 Ответ

0 голосов
/ 02 февраля 2019

Ваш планировщик, вероятно, использует один поток для выполнения заданий, поскольку они встречаются редко.Из Test.query похоже, что вы можете использовать Flask-SQLAlchemy, который по умолчанию использует сессию с областью действия, или, другими словами, сессию с локальным потоком.Ваша работа также не завершает транзакцию, неявно начатую запросом.В сочетании с использованием MySQL со значением по умолчанию REPEATABLE READ уровень изоляции транзакций приводит к тому, что задания совместно используют одну и ту же транзакцию и, следовательно, считывают из одного и того же снимка базы данных.Просто своевременно завершите транзакцию:

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