私は SQLAlchemy のプロジェクトに取り組んでいます。とCommand
呼ばれるカスタムのシリアライゼーション/デシリアライゼーション メソッドを持つクラスがありtoBinArray()
ますfromBinArray(bytes)
。私はそれを TCP 通信に使用します (私の関数はより小さな出力を作成するため、pickle を使用したくありません)。
Command
CommandGet
にはいくつかのサブクラスがあり、それらを、 などと呼びましょうCommandSet
。これらには、独自の属性を追跡するための追加のメソッドと属性、およびシリアル化メソッドの再定義があります。polymorhic_identity
メカニズムを使用して、それらすべてを1つのテーブルに保持しています。
問題は、多くのサブクラスがあり、それぞれに異なる属性があることです。以前にそれらすべてのマッピングを作成しましたが、このようにテーブルには膨大な量の列があります。
self.toBinArray()
DB へのすべての書き込みの前にすべてのインスタンスを属性self._bin_array
(バイナリ列に格納)にシリアライズ ( を使用) し、DB からインスタンスをロードするたびに属性をロード ( を使用) するメカニズムを書きたいと思いself.fromBinArray(value)
ます。
私の質問の一部に対する答えはすでに見つかりました。デコレータを使用self.fromBinArray(self._bin_array)
して関数を呼び出すことができます。@orm.reconstructor
すべてのCommand
サブクラスに継承され、適切に継承されたバージョンの を実行しますfromBinArray()
。私の質問は、DB への書き込み時にシリアル化を自動化する方法です (手動で設定できることはわかっていますself._bin_array
が、それは非常に面倒です)。
PS私のコードの一部、私のメインクラス:
class Command(Base):
__tablename__ = "commands"
dbid = Column(Integer, Sequence("commands_seq"), primary_key = True)
cmd_id = Column(SmallInteger)
instance_dbid = Column(Integer, ForeignKey("instances.dbid"))
type = Column(String(20))
_bin_array = Column(Binary)
__mapper_args__ = {
"polymorphic_on" : type,
"polymorphic_identity" : "Command",
}
@orm.reconstructor
def init_on_load(self):
self.fromBinArray(self._bin_array)
def fromBinArray(self, b):
(...)
def toBinArray(self):
(...)
編集:解決策を見つけました(以下の回答)が、他に解決策はありますか?クラス本体内にイベントリスニング関数を挿入するためのショートカットでしょうか?