尝试查找和更新原子日期时间字段时SQLALchemy收到错误

时间:2017-01-16 13:11:42

标签: python postgresql sqlalchemy

我需要原子地更新一行

我的代码:

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:无法比较offset-naive和offset-aware datetimes

我知道我的日期时间没有timezoneinfo(tzinfo使代码工作),但为什么第二个工作原子并且原子上没有。我想避免使用tzinfo总是我需要更新这个字段

1 个答案:

答案 0 :(得分:0)

我在这里解决了我的问题: http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.update.params.synchronize_session

当我尝试更新时,默认策略是&#39;评估&#39;,即尝试更新后的会话对象。我做了更新的条件,SQLAlchemy尝试执行他。我的会话有一个没有时区的日期时间的模型,并且当尝试将日期与tz和w / o进行比较时,python会出错

我解决了将战略转变为

的问题
...updates(values=..., synchronize_session=False)

我只需要小心在会话中使用我的对象,因为它已经过时了