Обновление нескольких строк SQLAlchemy, не работающих из запланированной задачи

#python #postgresql #flask #sqlalchemy

#python #postgresql #flask #sqlalchemy

Вопрос:

У меня есть эта модель :

задание класса (db.Model):

 __tablename__ = "job"

id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80), nullable=False)
city = db.Column(db.String(250), nullable=False)
state = db.Column(db.String(10), nullable=False)
zipCode = db.Column(db.String(10), nullable=False)
latitude = db.Column(db.String(10), nullable=False)
longitude = db.Column(db.String(10), nullable=False)
description = db.Column(db.String(200), nullable=False)
narrative = db.Column(db.String(250), nullable=False)
companyLogo = db.Column(db.String(250), nullable=False)
companyName = db.Column(db.String(250), nullable=False)
companyURL = db.Column(db.String(100), nullable=False)
time_created = db.Column(db.DateTime, nullable=False)
active = db.Column(db.Boolean, nullable=False)
  

Я пытаюсь обновить записи старше 14 дней, как указано в

 @classmethod
def deactivate_old_entries(cls)-> "JobModel":
    x_days = date.today() - timedelta(days=14)
    return cls.query.filter(Job.time_created < x_days).
        update({"active": (False)})
  

Я знаю, что часть фильтра работает нормально, потому что она корректно возвращает записи старше 14 дней, в данном случае 11 строк

Возвращаемое значение равно 11, указывающее, на мой взгляд, правильное количество строк.Но я не вижу никаких изменений в столбце, активном для этих 11 строк.Они остаются true, когда они должны показывать false

Похоже, что изменения не зафиксированы

Это асинхронная задача, выполняемая из запланированного рабочего модуля celery. Однако, даже если я запускаю из представления в запросе от POSTMAN, он делает то же самое, что означает, что он возвращает 11, но никаких изменений в столбце, активном в базе данных.

Есть идеи, где моя ошибка?

Комментарии:

1. Вы фиксируете? Кроме того, читатели сохраняют транзакцию открытой с уровнем изоляции, который не позволяет им видеть изменения?

Ответ №1:

Я должен был сделать это так

 def deactivate_old_entries()-> "JobModel":
    nigthy_days = date.today() - timedelta(days=14)
    db.session.query(Job).filter(Job.time_created < nigthy_days).
        update({"active": (False)})
    db.session.commit()
  

И это сработало нормально.