Я реализую спокойный POST API с Flask, использую sqlalchemy для обновления ресурса в PostgreSQL, скажем MyResource:
class MyResource(db.Model):
__tablename__ = 'my_resource'
res_id = Column(Integer, primary_key=True)
<other columns>
time_updated = Column(TIMESTAMP(timezone=True), onupdate=datetime.now(timezone.utc))
Есть экземпляр MyResource
, полученный из полезной нагрузки запроса API, давайте назовем его input_instance
.Ниже представлен мой подход к обновлению ресурса:
input_instance_dict = input_instance.__dict__
input_instance_dict.pop('_sa_instance_state', None) # this extra meta field will cause error in update().
update_count = MyResource.query.filter(MyResource.res_id == input_instance.res_id).update(input_instance_dict)
db.session.commit()
С учетом вышеизложенного столбцы обновляются, за исключением time_updated
, который остается нулевым;Я ожидаю, что он будет обновлен с указанием текущей даты и времени.
Если я удаляю поле time_updated
из ввода перед вызовом Query.update (),
input_instance_dict.pop('time_updated', None)
, тогда нулевое значение вСтолбец time_updated
будет обновляться с указанием текущей даты, НО ... при последующих обновлениях значение этого столбца остается прежним.
Я сомневаюсь, что даже при удалении поля time_updated
из входных данныхonupdate
вступает в силу только при первом обновлении, но не после.Зачем?Спасибо.
--- Обновление 12/23 10:56 по Гринвичу + 8
Дополнительное наблюдение, я только что повторно запустил то же обновление, что и прошлой ночью, *Столбец 1027 * обновляется для первой попытки, но не для второй.Это означает, что после самого первого обновления onupdate
включается и выключается для следующих обновлений.Я не могу понять шаблон, когда он будет работать, а когда нет.