将Storm实体复制到另一家商店?

时间:2012-10-04 03:04:49

标签: python storm-orm

我有一个使用Storm ORM将数据保存在本地SQLite数据库中的模块。我正在研究另一个将数据同步到中央PostgreSQL服务器的模块。我以为我会聪明并做以下事情:

unsynced = localStore.find(MyType, MyType.synced == False)

for assign in unsynced:
    self.remoteStore.add(assign)

这并不像希望的那样工作,抛出以下错误:

object at 0x18bb4d0 is part of another store

有没有办法打破与本地商店的关联,以便我可以远程保存数据?由于我需要在远程成功保存数据后翻转本地副本中的同步标记,这可能会略有复杂。

1 个答案:

答案 0 :(得分:2)

Storm中没有任何内容可以自动执行此操作,因为并不总是很明显应该复制的内容:

  1. 表示表的模型类可能无法完全描述基础表。可能还有其他字段未在Python端使用。
  2. 目前尚不清楚如何处理外键/引用。你也复制了相关的对象吗?您是否按原样保留外键ID并希望在插入第二个数据库时不会导致完整性错误?您是否尝试在其他数据库中找到等效对象来引用?您将使用哪个密钥进行搜索?
  3. 当然,这些问题可能不会影响您的申请。在这种情况下,您可以编写一个复制对象的方法,以便将其添加到另一个商店:

    def copy(self):
        """Create a new object with the same property values."""
        other = self.__class__()
        # Copy over the relevant fields.  If you're using an integer primary key,
        # then this probably doesn't include that key.
        other.foo = self.foo
        other.bar = self.bar
        ...
        return other
    

    然后,您可以更改代码以执行以下操作:

    for assign in unsynced:
        self.remoteStore.add(assign.copy())