SQLAlchemy データソース内のエンティティと、別の場所 (外部 REST API) から取り込まれたエンティティとの間で、フィールドごとのマージを実行しようとしています。私がやりたいことは次のようなものです:
class Person:
__tablename__ = "people"
id = Column(Integer,primary_key=True)
name = Column(String)
nameDatestamp = Column(DateTime)
address = Column(String)
addressDatestamp = Column(DateTime)
def merge(myPerson, foreignPerson):
if myPerson.nameDateStamp < foreignPerson.nameDateStamp:
myPerson.name = foreignPerson.name
myPerson.nameDateStamp = foreignPerson.nameDateStamp
if myPerson.addressDatestamp < foreignPerson.addressDateStamp:
myPerson.addressDatestamp = foreignPerson.addressDateStamp
myPerson.address = foreignPerson.address
たくさんのクラスとたくさんの分野のために。これは冗長すぎてベストプラクティスにはなりません。
DateStampedString (日付スタンプと文字列で構成される)、DateStampedRelationship などの新しいデータ モデルを導入できますが、複数のテーブルを使用することによる追加の間接性がマージの速度に寄与するのではないかと懸念しています。
実行時およびテーブルが作成される前に、追加の日付スタンプ列をモデルに動的に追加する引数を持つ Python デコレータを使用できます。
@datestamp(name,address) class Person: ...
を何らかの方法で利用
sqlalchemy.types.TypeDecorator
して新しいデータ型を構築することもできますが、2 つの型を一緒にバンドルするのではなく、(不透明な型)->(sqlalchemy 型) から移行することに関心があるようです。
私がやろうとしていることのベストプラクティスはありますか?
編集:私は探しています
- 一部のフィールドに日付スタンプがあることを宣言するより簡潔な方法
- マージ関数がどのキーをマージしているかを知る必要がないように、日付スタンプ付きフィールドを反復処理する方法
- 値が変更されるたびに日付スタンプを最新の状態に保つ何らかの方法