view Mapping.py @ 34:5813e3c10f14

move the database logic out into its own module. Make everything reload safe so that multiple sessions can be created from interactive sessions
author Dirk Olmes <dirk@xanthippe.ping.de>
date Wed, 05 May 2010 02:14:05 +0200
parents ee1432a91141
children aaec263f07ca
line wrap: on
line source


from Feed import Feed
from FeedEntry import FeedEntry
from sqlalchemy import Column
from sqlalchemy import DateTime
from sqlalchemy import ForeignKey
from sqlalchemy import Integer
from sqlalchemy import MetaData
from sqlalchemy import String
from sqlalchemy import Table
from sqlalchemy import Text
from sqlalchemy.orm import mapper
from sqlalchemy.orm import relation

mappingDefined = False

def createMapping(engine):
    """ Make sure the mapping is defined only once. This is not really needed for the feed updater
        or the GUI app but comes in handy when working interactively with the system. """
    global mappingDefined
    if not mappingDefined:
        _createMapping(engine)
        mappingDefined = True

def _createMapping(engine):
    metadata = MetaData(engine)
    
    feedTable = Table("feed", metadata,
        Column("pk", Integer, primary_key=True),
        Column("title", String(255), nullable=False),
        Column("rss_url", String(255), nullable=False)
    )
    
    feedEntryTable = Table("feed_entry", metadata,
        Column("pk", Integer, primary_key=True),
        Column("create_timestamp", DateTime, nullable=False),
        Column("read", Integer, nullable=False),

        Column("id", String(255), nullable=False),
        Column("link", String(255), nullable=False),
        Column("title", Text, nullable=False),
        Column("summary", Text, nullable=False),
        Column("updated", DateTime),
        Column("feed_id", Integer, ForeignKey("feed.pk"))
    )

    metadata.create_all()

    mapper(FeedEntry, feedEntryTable)
    mapper(Feed, feedTable,
        properties = {
            "entries" : relation(FeedEntry, backref = "feed")
        }
    )