1

我有一个使用 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

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

4

1 回答 1

2

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

  1. 表示表的模型类可能无法完全描述基础表。Python 端可能没有使用其他字段。
  2. 目前尚不清楚如何处理外键/引用。您是否也复制相关对象?您是否将外键 ID 保留原样并希望在插入第二个数据库时不会导致完整性错误?您是否尝试在其他数据库中查找等效对象以进行引用?您将使用哪个键进行搜索?

当然,这些问题可能不会影响您的应用程序。在这种情况下,您可以编写一个方法来复制一个对象,以便可以将其添加到另一个存储中:

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())
于 2012-10-10T02:08:15.980 回答