5

sqlalchemy データベースのバージョン管理を実装しようとしています (ここの例を使用: http://docs.sqlalchemy.org/en/rel_0_7/orm/examples.html#versioned-objects、およびソース tarball の history_meta.py .)

この例を使用すると、古いバージョンのオブジェクトを正常に取得できます。

history = Person.__history_mapper__.class_
old_person = history.filter(Person.id = instance.id, 
    history.version==someoldversion).one()

それが指すオブジェクトの古いバージョンを取得することもできます。

これを sqlalchemy のバージョン管理コードに実装する方法は、person_history というテーブルを追加することです。このテーブルには、Person が特定のバージョンで持っていたすべてのフィールド + バージョン フィールドが含まれています。

ただし、必要なのは、リレーションにバージョン管理を適用することです。たとえば、おそらくこの人物は以前は車を持っていましたが、今は持っていないので、彼が持っていたバージョンを取得する必要があります。これを可能にするために例を拡張する最良の方法を誰かが提案できますか?

4

1 に答える 1

2

あなたの質問は、SAの機能を理解するよりも、データモデリングの問題として簡単に解決できるかもしれません。Person-Carの例では、暗黙の多対多の関係(car_ownership_timeperiods)を、人の車の所有権を文書化するオブジェクトであるタイトルとして想像できます。

暗黙の多対多関係テーブルをスキーマ内の本格的なオブジェクトに昇格させることで、人物と車を関連付ける機能を保持し、必要に応じて履歴の追跡を含め、タイトルでSAのすべての機能を使用できます(あなたの例のクエリは、過去に人が所有していた車ですが、単純な等結合です)。

于 2012-07-31T02:25:56.663 に答える