from sqlalchemy import *

class Employee( object):
    name = '<notset>'
    def __str__(me):
        return ' '.join( [me.__class__.__name__, str(me.id), str(me.name), getattr( me.manager, 'name', '<none>') ])

db = create_engine( 'sqlite:///:memory:')
meta = BoundMetaData( db)
meta.engine.echo = 0

employee_table = Table('Employee', meta,
        Column('id', Integer, primary_key=True),
        Column('name', String, ),
        Column('atype', String),
        Column('manager_id', Integer,
                    ForeignKey( 'Employee.id',  #Employee
                       use_alter=True, name='whatever1'
                    )
            )
    )
meta.create_all()

ajoin = {
    'Employee': employee_table.select( employee_table.c.atype =='Employee'),
#   'Manager': join( employee_table, manager_table,manager_table.c.id ==employee_table.c.id),
}

Ajoin = polymorphic_union( ajoin, None )
mA = mapper( Employee, employee_table,
        select_table=Ajoin, polymorphic_on=Ajoin.c.atype,
        #polymorphic_on=employee_table.c.atype,
        polymorphic_identity='Employee',
        properties={
            'manager': relation( Employee,
            primaryjoin=employee_table.c.manager_id==employee_table.c.id,
            foreignkey=employee_table.c.manager_id,
#            lazy=True,
            uselist=False, post_update=True)
        }
)

#populate
session = create_session()

a = Employee()
a.name = 'Dilberto'

a.manager = a

session.save(a)
session.flush()

session.clear()
a = session.query(Employee).get(a.id)
assert a.name == 'Dilberto'
print a.manager
assert a.manager == a
