1

私はこれを理解していると思っていましたが、不思議に思っています!

repoze.catalog docoの例を考えると:

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 クラスの 2 つのインスタンスのカタログ エントリを生成する方法を示していますが、オブジェクトを実際に保存するための正しいメカニズムは何ですか?

repoze.catalog の下にカタログ化するために使用される docid をキーとするオブジェクトを格納する、完全に別個の ZODB データベースを持つことから始めましたが、トランザクションに関しては、オブジェクトを追加するときにコミットを発行する必要があるため、これは満足のいくものではありません。オブジェクトを格納するために使用されているカタログと 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 に答える