Here we go - now with composite columns:
from sqlalchemy import create_engine from sqlalchemy import Column, Integer, Text from sqlalchemy.orm import composite, sessionmaker from sqlalchemy.ext.declarative import declarative_base engine = create_engine('sqlite:///') session = sessionmaker(bind=engine)() Base = declarative_base() class MarkdownText(object): def __init__(self, text): self._text = text self._html = "<html>%s</html>" % text @classmethod def _from_db(cls, text, html): mt = MarkdownText(text) mt._html = html return mt def __composite_values__(self): return (self._text, self._html) def __str__(self): return self._text @property def __html__(self): return self._html class Foo(Base): __tablename__ = 'foo' id = Column(Integer, primary_key=True) a = composite(MarkdownText._from_db, Column('_text', Text), Column('_html', Text)) def __init__(self, a): self.a = MarkdownText(a) def __repr__(self): return '(%s)' % (self.a) Base.metadata.create_all(engine) session.add_all([Foo('test'), Foo('nips')]) session.commit() x = session.query(Foo).all() print x print x[0].a.__html__ print x[0].a
And it gives us a pleasant:
[(test), (nips)] <html>test</html> test
plaes source share