SQLAlchemy-将值序列化为表的列

时间:2013-08-11 18:14:50

标签: python database sqlalchemy

我正在使用SQLAlchemy中的一个项目。我有Command类,它具有名为toBinArray()fromBinArray(bytes)的自定义序列化/反序列化方法。我用它进行TCP通信(我不想使用pickle,因为我的函数创建了较小的输出)。

Command有几个子类,我们称之为CommandGetCommandSet等。他们有其他方法和属性以及序列化方法重新定义来跟踪自己的属性。我使用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

编辑:我找到了解决方案(下面的答案),但还有其他解决方案吗?也许有一些在类体内插入事件监听功能的快捷方式?

1 个答案:

答案 0 :(得分:0)

看起来解决方案比我预期的更简单 - 你需要为before_insert(和/或before_update事件)使用事件监听器。我找到了

的信息(source
  

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)非常重要,因此子类可以继承监听器!