sqlalchemy - использование объектов вне области сеанса - PullRequest
1 голос
/ 08 октября 2019

У меня есть объект Job, который я создаю в начале вызова API:

class Job(Base):
    __tablename__ = 'jobs'
    id = Column(BIGINT, primary_key=True)
    end_date = Column('end_date', DateTime(timezone=True), nullable=False)
    start_date = Column('start_date', DateTime(timezone=True), default=datetime.datetime.utcnow(), nullable=False)
    name = Column('name', TEXT, nullable=False)

    def __init__(self, name):
        self.name = name
        self.start_date = datetime.datetime.utcnow()
        self.end_date = 'infinity'

Когда вызывается API, я создаю новую работу:

job=Job(name="job1")
session.add(job)
session.commit()
session.close()

Однако после запуска задания я хочу отправить этот объект задания в качестве параметра некоторым другим потокам, чтобы узнать, какое задание отвечало за этот поток.

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

sqlalchemy.orm.exc.DetachedInstanceError: Instance <Job at 0x3c67f30> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: http://sqlalche.me/e/bhk3)

Я хочу сохранить объект работы до его запуска. В любом случае, я могу использовать его вне области сеанса, но после того, как я его сохранил? Я знаю, что могу запросить его позже, но я не хочу, я хочу работать с тем же объектом задания, который я создал ..

Мое текущее решение:

session.add(job)
session.commit()
get_job_id_query = (
session.query
.find(Job.id).filter(Job.end_date == 'infinity')
.filter(Job.name == job.name)
)
job_id = get_job_id_query.all()[0][0]
session.close()

, а затем япередать идентификатор следующим потокам ..

1 Ответ

1 голос
/ 12 октября 2019

Сеанс принимает аргумент expire_on_commit , который оставляет объекты доступными после фиксации, если для него установлено значение False.

. При его использовании необходимо учитывать, что срок действия истекобъекты будут не синхронизированы с базой данных, если данные обновляются во время другого сеанса.

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