0

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.

バージョン管理が行われていない理由についての手がかりはありますか?

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 に答える