我需要原子地更新一行
我的代码:
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总是我需要更新这个字段
答案 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)
我只需要小心在会话中使用我的对象,因为它已经过时了