Объект сеанса Flask-SQLAlchemy не видит изменений в базе данных? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть сайт на PythonAnywhere, который использует Flask и Flask-SQLAlchemy, подключенный к базе данных MySQL. Пользователи могут использовать веб-сайт для постановки в очередь задачи, которая сохраняется в базе данных как запись в таблице, а затем отдельная запланированная задача (программа Python) проверяет базу данных и обрабатывает каждую необработанную запись.

Проблема, с которой я сталкиваюсь, заключается в том, что запрос к базе данных запланированной задачи, похоже, находит новые записи только при первом запуске, но если я затем использую веб-сайт для добавления новой задачи, повторяющаяся запланированная задача повторяется Запросы базы данных (каждые 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)

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Все запросы SqlAlchemy по умолчанию выполняются внутри транзакции http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html. Вот почему вы получаете новые данные только при первом вызове вашего скрипта. Поскольку внутри транзакции видимые данные не изменятся, то есть я в ACID, транзакции изолированы. После принятия или отката следующий запрос запускает новые транзакции, поэтому вы получите свежие данные из базы данных.

0 голосов
/ 04 сентября 2018

Нашел исправление: по какой-то причине запустил 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
...