A possible approach with Nevow and Storm/twisted-integration

(thanks to these very nice guys in mailing list)

Set up pool

from storm.databases.sqlite import SQLite
from storm.uri import URI
from storm.twisted.store import StorePool

database = SQLite(URI('sqlite:///test.db'))
pool = StorePool(database, 5, 10)

pool.start()

Create models

from storm.locals import *
from storm.twisted.wrapper import DeferredReference

class People(object):
    __storm_table__ = 'people'

    id                      =       Int(primary=True)
    email           =       Unicode()
    nickname        =       Unicode()
    passwd          =       Unicode()
    avatar          =       Unicode()


class Topic(object):
    __storm_table__ = 'topic'

    id                      =       Int(primary=True)
    topic_title     =       Unicode()
    keyword         =       Unicode()
    content         =       Unicode()
    people_id       =       Int()
    people          =       DeferredReference(people_id, People.id)


    posted          =       DateTime()

and have fun

from twisted.internet.defer import inlineCallbacks, returnValue

from db import pool
from db.models import Topic


    def getTopics(self):
            @inlineCallbacks
            def transaction(store):
                    dr = yield store.find(Topic, Topic.topic_title==self.topic, Topic.keyword==self.keyword)

                    dr.order_by(Desc(Topic.posted))
                    items = yield dr.all()

                    for item in items:
                            #do whatever.
                            people = yield item.people
                            #do whatever else.

                    #this can recycle stores in pool
                    yield store.commit()

                    returnValue(   ) #return whatever you want.

            return pool.transact(transaction)