我使用SQLAlchemy版本化对象示例作为参考。
示例:http://docs.sqlalchemy.org/en/rel_0_7/orm/examples.html#versioned-objects
当我更新记录时,我没有错误。正在创建case_history表,但版本号保留在' 1'并且case_history表为空。
(是的,我知道我正在使用' case'作为班级名称。那是不是很糟糕?)
以下是我的代码段:
models.py:
from history_meta import Versioned, versioned_session
# set up the base class
class Base(object):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
id = Column(Integer, primary_key = True)
header_row = Column(SmallInteger)
def to_dict(self):
serialized = dict((column_name, getattr(self, column_name))
for column_name in self.__table__.c.keys())
return serialized
Base = declarative_base(cls=Base)
class case(Versioned, Base):
title = Column(String(32))
description = Column(Text)
def __repr__(self):
return self.title
app.py:
engine = create_engine(SQLALCHEMY_DATABASE_URI)
Session = sessionmaker(bind=engine)
versioned_session(Session)
db = Session()
...
@app.route('/<name>/:record', method='POST')
def default(name, record):
myClass = getattr(sys.modules[__name__], name)
db.query(myClass).filter(myClass.id == record).update(request.json)
for u in db.query(case).filter(case.id == record):
print u.version # Version is always 1
db.commit() # I added this just to test versioning.
有关为什么版本控制没有发生的任何线索?
答案 0 :(得分:1)
对于那些在这里找到路的人......
请记住:即使filter()
返回单个对象,update()
方法也是批量操作,其行为也不同。版本可能仅在after_update()
之类的事件上递增,而不会在批量操作中触发。
答案 1 :(得分:0)
即使数据发生更改,更新查询也不会导致版本增加。可能有办法“倾听”这种变化,但我不知道。
您必须更改映射类的属性:
#Get an instance of the class
myItem = db.query(myClass).get(record)
#Change an attribute
myItem.title="foo"
#Commit if necessary
db.commit()