0

我使用 SQLAlchemy 版本化对象示例作为参考。

示例:http ://docs.sqlalchemy.org/en/rel_0_7/orm/examples.html#versioned-objects

当我更新记录时,我没有收到任何错误。正在创建 case_history 表,但版本号保持在 '1' 并且 case_history 表为空。

(是的,我知道我使用“case”作为类名。这很糟糕吗?)

这是我的代码片段:

模型.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

应用程序.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.

关于为什么没有发生版本控制的任何线索?

4

2 回答 2

1

对于其他在这里找到自己的方式的人......

请记住:即使filter()返回单个对象,该update()方法也是批量操作,并且行为不同。版本可能仅在after_update()不会触发批量操作的事件上增加。

update()在此处阅读有关操作注意事项的更多信息。

于 2015-11-02T21:22:23.683 回答
0

即使数据更改,更新查询也不会导致版本增加。可能有办法“倾听”这种变化,但我不知道。

您必须更改映射类的属性:

#Get an instance of the class
myItem = db.query(myClass).get(record)

#Change an attribute
myItem.title="foo"

#Commit if necessary                 
db.commit()
于 2013-02-17T00:12:16.803 回答