2017-06-15 41 views
2

我需要存儲一些信息並能夠讀寫這些信息。我可以創建一個自定義的小型ZODB(http://www.zodb.org/en/latest/articles/ZODB1.html)並讓Plone讀/寫這個嗎?將它放在/var/filestorage/myzodb.fs中會導致現有的Plone和它使用的數據庫出現任何問題?在Plone中創建一個自定義的ZODB?

+1

什麼是用例?另一項服務是否直接訪問數據庫? – Mathias

+1

Plone不會關心firestorage目錄中的未知fs文件,但我同意Mathias,使用另一個zodb似乎...古怪,但不知道你的情況到底是什麼。 –

+1

你總是可以使用註釋來存儲對象的非模式相關信息;)https://docs.plone.org/develop/plone/misc/annotations.html#content-annotations – avoinea

回答

3

正如我之前說的,你可以隨時使用註釋來存儲對象非模式相關的信息:

>>> from persistent.list import PersistentList 
>>> from persistent.dict import PersistentDict 
>>> from zope.annotation.interfaces import IAnnotations 

>>> anno = IAnnotations(self.context) 

>>> anno['employees'] = PersistentList(['Mary', 'Jo', 'Bob']) 
>>> anno['codes'] = PersistentDict({'a': 1, 'b': 2}) 

更多細節

docs如果你仍然想存儲數據不同的ZODB文件,您應該注意3個主要問題:

  • 縮放
  • DB連接
  • DB讀/寫衝突錯誤

爲了擴展它,你應該使用ZEO(或RelStorage)。我會假設你使用zc.buildout來部署你的Plone堆棧。因此,內buildout.cfg

[zeoserver] 
recipe = plone.recipe.zeoserver 
zeo-address = 127.0.0.1:8100 
... 
zeo-conf-additional = 
    <filestorage 2> 
     path ${buildout:directory}/var/myzodb.fs 
    </filestorage> 

[instance] 
recipe = plone.recipe.zope2instance 
... 
zeo-client = True 
zeo-address = 127.0.0.1:8100 
zope-conf-additional = 
    <zodb_db myzodb> 
     <zeoclient> 
      server 127.0.0.1:8100 
      storage 2 
      name myzodbstorage 
     </zeoclient> 
     mount-point /myzodb 
    </zodb_db> 

現在,連接和存儲數據到這個新的DB:

>>> from App.config import getConfiguration 
>>> from zope.component.hooks import getSite 

>>> db = getConfiguration().dbtab.getDatabase(name='myzodb')  
>>> conn = getSite()._p_jar.get_connection('myzodb') 
>>> myzodb = conn.root() 
>>> myzodb 
{} 

>>> myzodb['employees'] = ['Mary', 'Jo', 'Bob'] 
>>> myzodb['codes'] = {'a': 1, 'b': 2} 

>>> import transaction 
>>> transaction.commit() 
+0

如果數據量較大,則可能需要使用OOBtree而不是PersistentDict。見https://www.slideshare.net/carlos.delaguardia/zodb-tips-and-tricks – Tom

0

您還可以使用souper輕重量數據:

>>> from souper.soup import get_soup 
>>> soup = get_soup('my_soup_id', context) 
>>> soup 
<souper.soup.Soup at 0x...> 

它也支持索引。