RelStorage and PostgreSQL

After a bit of experimentation I’ve succeeded in moving an existing Plone 3.3.5 from the normal FileStorage storage (in other words a ZODB in a Data.fs file) to RelStorage using PostgreSQL. This is a blog post about what I needed to change in the buildout configuration and which resources I used.

The first thing on the todo list was making sure there is a database which can be used to store the data. Since the installation of PostgreSQL is rather platform dependent, I won’t describe it here. Creating the database itself and a user are described clearly in the Relstorage documentation.

The part I found most interesting was the setup of the buildout. Fortunately this is also nicely documented. Have a look at Shane Hathaway’s weblog and specifically the entries How to Install Plone with RelStorage and MySQL and RelStorage 1.3.0b1, Now With Blob Support. Another source of information is the Plone on RelStorage presentation by Lars R. Noldan.

This resulted in the following changes to the buildout:

[buildout]
find-links =
    ...
    http://packages.willowrise.org
parts =
    ...
    zodbscripts

[zope2]
additional-fake-eggs =
    ...
    psycopg2

[instance]
zeo-client = false
eggs =
    ...
    RelStorage
rel-storage =
    type postgresql
    dbname zodb
    user zodbuser
    host localhost
    password zodbuser

[zodbscripts]
recipe = zc.recipe.egg
eggs = ${instance:eggs}
interpreter = zopepy
extra-paths = ${instance:zope2-location}/lib/python
scripts = zodbpack zodbconvert

[versions]
...
RelStorage = 1.4.0c4
ZODB3 = 3.7.3-polling

You need additional configuration files to use the zodbconvert and zodbpack scripts. It took me a while to get this setup properly since initially I could not find examples on how to configure the connection to the PostgreSQL database. The solution was hidden in the RelStorage presentation by Rogerio Ferreira.

<filestorage source>
  path /tmp/Data.fs
</filestorage>
<relstorage destination>
  <postgresql>
    dsn dbname='zodb' user='zodbuser' host='localhost' password='zodbuser'
  </postgresql>
</relstorage>

And the zodbpack configuration file:

<relstorage>
  pack-gc true
  pack-duty-cycle 0.9
  <postgresql>
    dsn dbname='zodb' user='zodbuser' host='localhost' password='zodbuser'
  </postgresql>
</relstorage>

Once I found out how to connect to the database with these scripts I noticed that a similar connection string was also used in the rel-storage option in the RelStorage 1.3.0b1 weblog entry.

This is basically all that I needed to start using RelStorage on the Plone 3.3.5 site of the customer.