Durus
I've recently been using this nifty little object database, Durus, on several small projects. It's dead simple, the only documentation you need to get started and grok the concepts is their presentation from PyCon 2005. Having worked with ZODB helps – Durus draws heavily from that.
So Durus gives you two basic building blocks. You have the DB connection and you have the Persistent class. The DB connection is fairly obvious: open a database file (or connect to a server), retrieve data, commit, rollback, close. Persistent is where the magic lives: inherit from Persistent and your object will be a first-class database container. When you make changes, Persistent will be notified automatically; commit or abort and the data gets saved or reverted. There's one caveat: Persistent can't detect changes inside mutable attributes (like a list or dict), but there are simple ways around this.
Several power tools come in the package. There's PersistentList and PersistentDict (which behave like list and dict, but detect when you make changes); BTree, which is like PersistentDict, except it's much better for handling a large number of entries; and ComputedAttribute, with is a fancy way of saying "don't persist this piece of information, I want to compute it myself". There's also machinery to run a server with multiple clients but I haven't used any of that.
Mostly Durus just keeps out of your way. The data model is basically Python's data model. No need to map table columns to object fields; no serializing to a foreign format (JSON, XML); just plain Pickle. You still need to have some level of understanding of how the bits are being stored, and object databases are weird animals at that, but it's much more fun than hand-optimizing SQL queries.

Reader Comments
This could be very useful to me, too, but one question: do Persistent objects with Durus commit the data themselves (making it as transparent as ZODB) or do I have to do that manually?
Just like ZODB, it stores all attributes of an object, even deeply nested data.