
from sqlalchemy import *
from sqlalchemy.orm import *

class Base( object):
    'with __init__(kwargs) and nice/non-recursive str()'
    def __init__( me, **kargs):
        for k,v in kargs.iteritems(): setattr( me, k, v)
    props = [ 'id' ]  #[...]
    props4ref = props + [ 'name' ]
    def __str__( obj, props =None):
        klas = obj.__class__
        r = klas.__name__ + '('
        for k in props or klas.props:
            v = getattr( obj, k, '<notset>')
            if isinstance( v, Base):
                v = '>' + v.__str__( klas.props4ref)
            r += ' '+k+'='+str(v)
        return r+' )'


db = create_engine( 'sqlite:///')
#db.echo = config.echo
meta = MetaData( db)

table_A = Table( 'A', meta,
    Column( 'name', String(length=200), ),
    Column( 'db_id',   primary_key= True,   type_= Integer, ),
)
table_B = Table( 'B', meta,
    Column( 'name', String(length=200), ),
    Column( 'dataB', String(length=200), ),
    Column( 'db_id',   primary_key= True,   type_= Integer, ),
)

meta.create_all()

class A( Base):
    props = ['db_id', 'name']
class B( A):
    props = ['db_id', 'name', 'dataB']

pu_a = polymorphic_union( {
#!!!            'A': table_A,
                'B': table_B,
                }, 'atype', 'pu_a', ) #concrete table
mapper_A = mapper( A, table_A,
            polymorphic_identity= 'A',
            polymorphic_on= pu_a.c.atype,
            select_table= pu_a,
            )

mapper_B = mapper( B, table_B,
            concrete= True,
            inherits= mapper_A,
            polymorphic_identity= 'B',
            )

#populate
b = B()
b.name = 'ben'
b.dataB = 'gun'

session = create_session()
session.save(b)
session.flush()

for q in session.query(A).all(): print q

