SQLALchemy получение ошибки при попытке найти и обновить атомарно datetime поля

Мне нужно обновить атомарно одну строку

мой код:

class TestModel(Base):
    __tablename__ = 'table1'
    id = Column(Integer, primary_key=True, autoincrement=True)
    col1 = Column(String)
    col2 = Column(DateTime(timezone=True))


if __name__ == '__main__':
    engine = create_engine('postgresql+psycopg2://postgres:teste123!@localhost/teste', echo=True)
    Session = sessionmaker(bind=engine)
    session = Session()

    TestModel.metadata.drop_all(engine)
    TestModel.metadata.create_all(engine)

    date1 = datetime(2017, 1, 10, 0)
    date2 = datetime(2017, 1, 11, 0)

    t = TestModel()
    t.col1 = "test"
    t.col2 = date1
    session.add(t)
    session.commit()

    # atomically doesn't work
    session.query(TestModel).filter(and_(TestModel.id == 1, TestModel.col2 < date2))
        .update({TestModel.col2.name: date2})

    # two operation work
    result = session.query(TestModel).filter(and_(TestModel.id == 1, TestModel.col2 < date2)).one()  # works
    if result:
        result.col2 = date2
        session.commit()

Когда я пытаюсь сделать атомарно, я получаю ошибку:
TypeError: не удается сравнить даты со смещением-наивные и со смещением

Я знаю, что мой datetime не имеет timezoneinfo (tzinfo делает код для работы), но почему второй работает и атомарно не работает. Я хочу избежать использования tzinfo всегда, что мне нужно обновить это поле

1 ответ

  1. Я решаю свой вопрос здесь:
    http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.update.params.synchronize_session

    Когда я пытаюсь обновить, стратегия по умолчанию — «оценить», то есть попытаться обновить объекты сеанса после. Я сделал условие, чтобы обновить и SQLAlchemy попытаться выполнить его. у моего сеанса есть модель с datetime без часового пояса, и python получает ошибку, когда пытается сравнить дату с tz и w / o

    Я решаю изменить стратегию на

    ...updates(values=..., synchronize_session=False)
    

    Мне просто нужно быть осторожным с использованием моих объектов в сеансе, потому что он устарел