2012-10-31 3 views
1

나는 이것을 이해할 줄 알았지 만 나는 궁금해지기 시작했다! 당신이 생각하는 경우ZODB/repoze.catalog - 동일한 데이터베이스에 개체와 카탈로그 저장?

repoze.catalog doco example :

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() 

이 어떻게 컨텐츠 클래스의 두 인스턴스에 대한 카탈로그 항목을 생성 할 수 있지만 실제로 객체를 저장하기위한 정확한 메커니즘은 무엇인가 보여?

나는 완전히 분리 된 ZODB 데이터베이스를 가지고 있는데,이 객체는 repoze.catalog 아래에 카탈로그를 만드는 데 사용 된 docid에 키가있는 객체를 저장하기 시작했다.하지만 트랜잭션을 처리 할 때 객체를 추가 할 때 만족스럽지 않기 때문에 개체를 저장하는 데 사용되는 ZODB 데이터베이스와 카탈로그 모두에서 커밋을 실행하십시오.

나는 repoze.catalog 구조 내에있는 ZODB 카탈로그에 액세스하여 실제 객체를 저장하는 데 사용할 수 있다고 가정했지만 실제로 수행하는 방법을 찾는 데 어려움이 있습니다.

+0

이었다; transaction.get(). commit()은 모든 트랜잭션 관리자 (이 경우 모든 ZODB 데이터베이스)에 변경 사항을 적용합니다. – sdupton

+0

나는 적절하게 생각하지 못했습니다. 당신이 저에게 해보라고했는데, 정말 고마워했습니다. – shearichard

답변

3

repoze.catalog과 같은 카탈로그는 내용을 인덱싱하고 저장하지 않기위한 것입니다. 해당 콘텐츠의 특정 측면을 색인화하여 콘텐츠를 쉽고 효율적으로 다시 찾아야합니다.

주어진 예제는 완전히 독립형이며 데이터를 별도의 ZODB 파일에 저장합니다. 이는 카탈로그가 자체 인이 아니고이 ZODB에 저장된 데이터에 사용되는 용도를 지원하기위한 것입니다.

그러나 콘텐츠를 저장하는 동일한 ZODB에 카탈로그를 저장할 수 있습니다. 콘텐츠 개체는 basic rules for persistent objects을 따라야하지만, 그렇지 않은 경우 저장소 구조를 자유롭게 설계 할 수 있습니다.

가 제공 FileStorageCatalogFactory를 사용하지 않는, 자신을위한 repoze.catalog 카탈로그를 작성하려면 repoze.catalog.catalog.Catalog 인스턴스화 : 나는 느낌이 >>> 수입 트랜잭션에서

from repoze.catalog.catalog import Catalog 

if 'mycatalog' not in zodbroot: 
    zodbroot['mycatalog'] = Catalog() 
+0

고마워요. 그저 내가 한 것뿐입니다. 매우 유용합니다. – shearichard