我正在使用SQLAlchemy中的一个项目。我有Command
类,它具有名为toBinArray()
和fromBinArray(bytes)
的自定义序列化/反序列化方法。我用它进行TCP通信(我不想使用pickle,因为我的函数创建了较小的输出)。
Command
有几个子类,我们称之为CommandGet
,CommandSet
等。他们有其他方法和属性以及序列化方法重新定义来跟踪自己的属性。我使用polymorhic_identity
机制将所有这些都保存在一个表中。
问题是有很多子类,每个子类都有不同的属性。我之前已经为每个人编写了映射,但这种方式表有大量的列。
我想编写一种机制,在每次写入DB并加载之前,将每个实例序列化(使用self.toBinArray()
)属性self._bin_array
(存储在二进制列中)(使用{{1每次从DB加载实例后的属性。
我已经找到了部分问题的答案:我可以使用self.fromBinArray(value)
装饰器调用self.fromBinArray(self._bin_array)
函数。它由每个@orm.reconstructor
子类继承,并执行Command
的正确继承版本。 我的问题是如何在写入数据库时自动化序列化(我知道我可以手动设置fromBinArray()
,但这非常麻烦)?
P.S。我的部分代码,我的主要课程:
self._bin_array
编辑:我找到了解决方案(下面的答案),但还有其他解决方案吗?也许有一些在类体内插入事件监听功能的快捷方式?
答案 0 :(得分:0)
看起来解决方案比我预期的更简单 - 你需要为before_insert
(和/或before_update
事件)使用事件监听器。我找到了
reconstructor()是进入更大的“实例级别”系统的快捷方式 事件,可以使用事件API订阅 - 请参阅 InstanceEvents获取这些事件的完整API描述。
这给了我线索:
@event.listens_for(Command, 'before_insert', propagate = True)
def serialize_before_insert(mapper, connection, target):
print("serialize_before_insert")
target._bin_array = target.toBinArray()
你也可以使用event.listen()
函数来绑定''事件监听器到实例,但我个人更喜欢装饰方式。在声明中添加propagate = True)
非常重要,因此子类可以继承监听器!