在Plone中创建一个自定义的ZODB?
问题描述:
我需要存储一些信息并能够读写这些信息。我可以创建一个自定义的小型ZODB(http://www.zodb.org/en/latest/articles/ZODB1.html)并让Plone读/写这个吗?将它放在/var/filestorage/myzodb.fs中会导致现有的Plone和它使用的数据库出现任何问题?在Plone中创建一个自定义的ZODB?
答
正如我之前说的,你可以随时使用注释来存储对象非模式相关的信息:
>>> 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...>
它也支持索引。
什么是用例?另一项服务是否直接访问数据库? – Mathias
Plone不会关心firestorage目录中的未知fs文件,但我同意Mathias,使用另一个zodb似乎...古怪,但不知道你的情况到底是什么。 –
你总是可以使用注释来存储对象的非模式相关信息;)https://docs.plone.org/develop/plone/misc/annotations.html#content-annotations – avoinea