1

我以为我明白这一点,但我开始怀疑!

如果您考虑repoze.catalog 文档示例

from repoze.catalog.catalog import FileStorageCatalogFactory
from repoze.catalog.catalog import ConnectionManager

from repoze.catalog.indexes.field import CatalogFieldIndex
from repoze.catalog.indexes.text import CatalogTextIndex

factory = FileStorageCatalogFactory('catalog.db', 'mycatalog')

_initialized = False

def initialize_catalog():
    global _initialized
    if not _initialized:
        # create a catalog
        manager = ConnectionManager()
        catalog = factory(manager)
        # set up indexes
        catalog['flavors'] = CatalogFieldIndex('flavor')
        catalog['texts'] = CatalogTextIndex('text')
        # commit the indexes
        manager.commit()
        manager.close()
        _initialized = True

class Content(object):
    def __init__(self, flavor, text):
        self.flavor = flavor
        self.text = text

if __name__ == '__main__':
    initialize_catalog()
    manager = ConnectionManager()
    catalog = factory(manager)
    content = {
         1:Content('peach', 'i am so very very peachy'),
         2:Content('pistachio', 'i am nutty'),
         }
    for docid, doc in content.items():
        catalog.index_doc(docid, doc)
    manager.commit()

这向您展示了如何为 Content 类的两个实例生成目录条目,但实际保存对象的正确机制是什么?

我一开始有一个完全独立的 ZODB 数据库,我在其中存储了在 docid 上键入的对象,该 docid 用于在 repoze.catalog 下对它们进行编目,但是当涉及事务时,这不太令人满意,因为在添加对象时我必须发出提交用于存储对象的目录和 ZODB 数据库。

我曾假设我能够访问 repoze.catalog 结构中的 ZODB 目录并使用它来存储实际对象,但我很难找到如何做到这一点。

4

1 回答 1

3

像这样的目录repoze.catalog旨在索引内容,而不是存储它。它的目的是通过索引内容的某些方面,使找回您的内容(存储在其他地方)变得容易和高效。

给出的示例是完全独立的,并将其数据存储在单独的 ZODB 文件中。这是为了支持目录用于本身未存储ZODB 中的数据的用例。

但是,您可以自由地将目录存储在存储内容的同一个 ZODB 中。您的内容对象应该遵循持久对象的基本规则,但您可以自由地构建存储结构。

要为自己创建repoze.catalog目录,而不使用提供的FileStorageCatalogFactory,只需实例化repoze.catalog.catalog.Catalog

from repoze.catalog.catalog import Catalog

if 'mycatalog' not in zodbroot:
    zodbroot['mycatalog'] = Catalog()
于 2012-10-31T16:54:41.877 回答