from sqlalchemy import *
from sqlalchemy.orm import *
meta = MetaData( 'sqlite:///')
#meta.bind.echo=True
Base=object

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

meta.create_all()

class A( Base):pass
class B( A):pass

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,
            with_polymorphic= ('*', 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()

print 'A'*20
for z in session.query( A): print z
print 'B'*20
for z in session.query( B): print z

"""
A.query_ALL_instances: AssertionError:
 result=[]
 expect=['B/id=1( name=ben dataB=gun )']


"""


