2012-10-31 15 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,但您可以自由設計存儲結構。

爲自己創建一個repoze.catalog目錄,不使用提供FileStorageCatalogFactory,只需實例repoze.catalog.catalog.Catalog

from repoze.catalog.catalog import Catalog 

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

謝謝,這正是我之後的事,非常有用。 – shearichard