A programmer recently was dismissed for failing to produce satisfactory results after working on a project for 4 months.
He told his employer that “zodb is just too hard”.
Now i have a similar project that i am working on and decided to use Zodb for my storage. As usual i started to google for some quick examples and documentation.
2 weeks into the project i realize that some of my data are not “persisting” as it should while it managed to fool the unit test . I wrote some small single modules to simulate the situation and realized that the same data are not persisting even though another variation of the same code does.
To cut the story short, if you are doing or intend to use Zodb as your storage, just follow the rules below, forget whatever “friendly” samples you have seen, they just don’t reflect the issues that can arise :
1. Any classes that you store in the Zodb, derive it from “Persistent”.
from persistent import Persistent
class Whatever (Persistent) :
2. Any dictionary or List that you want to store in Zodb, don’t bet on your luck, use the following wrappers.
If you want to store dict, use PersistentMapping
If you want to store list, use PersistentList
from persistent.mapping import PersistentMapping
from persistent.list import PersistentList
root[secret_key] = PersistentMapping()
root[secret_key][“mykey”] = “yada”
3. The connection and root must be opened by the thread that wants to use it or only use 1 single thread
storage = FileStorage(Path)
db = DB(storage)
connection = db.open()
root = connection.root()
while “storage” and “db” are shareable across threads, “connection” and “root” are not. Each new thread must do the “db.open()” and “connection.root()” call.
Alternatively you can assign one single thread to do all the above opening of handles and access the “root” and “connection” freely among multi-threads, but you must ensure that “single thread” you assigned will be the same one closing the database.