Повторение того же запроса к базе данных возвращает дополнительные результаты - PullRequest
0 голосов
/ 11 марта 2020

В течение длительного времени, пока l oop, я пытаюсь проверить первую запись, которая соответствует моим критериям, для выполнения действий над ней. Фильтрующий аспект запроса был удален из моего кода ниже только из соображений простоты, в любом случае я получаю ту же проблему).

В следующем фрагменте кода:

 while True:
    time.sleep(2)
    item = Session.query(Model).order_by(Model.id.asc()).first()
    print(f'Item id: {item.id}')

Чего я хочу добиться в качестве вывода:

Item id: 1
Item id: 1
Item id: 1

Вместо этого я получаю следующее:

Item id: 1
Item id: 2
Item id: 3

Что я делаю неправильно? Я не понимаю, почему он переходит к следующей записи, когда я даже не обновляю данные таблицы. Я даже не уверен, какой термин искать в Google, чтобы попытаться решить эту проблему ...

Я пытался использовать flush() на Session, но это, похоже, не имеет никакого значения .

В случае, если это имеет значение, я использую следующие импорты:

from flask import Flask
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
import os, time, sys

ОБНОВЛЕНИЕ:

Обновление того, что я ' мы обнаружили до сих пор: это на самом деле комбинация 2 вещей, которые делают это:

  • filter_by (status = 0)

  • item.status = 1

Добавление фильтра в запрос, а затем попытка обновить столбец состояния записи, например (независимо от того, действительно ли я фиксирую результат в БД или нет)

Так что, если я достану любой из этих 2 предметов, то он будет работать нормально ... но они мне нужны!

1 Ответ

0 голосов
/ 11 марта 2020

Хорошо, хотя мне еще предстоит узнать, ПОЧЕМУ он ведет себя так, по крайней мере, теперь я наконец-то узнал, что мне нужно сделать, чтобы решить проблему:

После запроса в каждом итерация выполнила свою задачу (в моем случае, вытащил 1-ю запись из БД, которую нужно обработать, а затем обработал ее), затем мне нужно было вызвать следующее: session.expire_all(), и это решило мою проблему.

Итак, в моем примере выше, теперь он должен выглядеть следующим образом:

def main():
    while True:
        item = Session.query(Queue).order_by(Queue.id.asc()).filter_by(status=0).first()
        if item:
            try:
                item.status = 1
                Session.commit()
                print(f'Item id: {item.id}')
                Session.expire_all() # <---- Add this line
            except:
                print('error')
        time.sleep(2)

Это раздел в документации по SQLAlchemy, который примерно указывает на это направление: SQLAlchemy - Обновление / Истечение срока действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...