在Plone中创建一个自定义的ZODB?

问题描述:

我需要存储一些信息并能够读写这些信息。我可以创建一个自定义的小型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

正如我之前说的,你可以随时使用注释来存储对象非模式相关的信息:

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

您还可以使用souper轻重量数据:

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

它也支持索引。