from sqlalchemy import *
import logging

logging.basicConfig()
metadata = BoundMetaData('sqlite://')

employees = Table('employees', metadata, 
   Column('uid', Integer, primary_key=True),
   Column('ts', Integer, primary_key=True),
   Column('name', String(50)),
   Column('type', String(30)))

managers = Table('managers', metadata, 
   Column('mid', Integer, primary_key=True),
   Column('uid', Integer, ForeignKey('employees.uid'), primary_key=True),
   Column('m_info', String(50)),
   )
metadata.create_all()

employees.insert().execute(
    dict(uid = 1, ts=1, name = 'Tom', type = 'a'),
    dict(uid = 1, ts=2, name = 'Tom', type = 'b'),
    dict(uid = 2, ts=1, name = 'Dick', type = 'a'),
    dict(uid = 3, ts=1, name = 'Harry', type = 'a'),
)

managers.insert().execute(
    dict(mid = 1, uid = 1, m_info = 'm 1 1'),
    dict(mid = 2, uid = 1, m_info = 'm 2 1'),
    dict(mid = 3, uid = 1, m_info = 'm 3 1'),
    dict(mid = 1, uid = 2, m_info = 'm 1 2'),
    dict(mid = 2, uid = 2, m_info = 'm 2 2'),
    dict(mid = 3, uid = 2, m_info = 'm 3 2'),
    dict(mid = 1, uid = 3, m_info = 'm 1 3'),
    dict(mid = 2, uid = 3, m_info = 'm 2 3'),
    dict(mid = 3, uid = 3, m_info = 'm 3 3'),
)

class Employee(object):
    def __repr__(self):
        return self.__class__.__name__ + " " + self.name
    def clone(self) :
        n = Employee()
        for k in self.c.keys() :
            setattr(n,k,getattr(self,k))
        return n

class Manager(Employee):
    def __repr__(self):
        return self.__class__.__name__ + " " + self.name + " " +  self.m_info
    def clone(self) :
        n = Manager()
        for k in self.c.keys() :
            setattr(n,k,getattr(self,k))
        return n


person_mapper = mapper(Employee, employees)

p_l_mapper = mapper(Employee, select([employees, func.max(employees.c.ts).label('ts')],
    group_by=[employees.c.uid]).alias('t'),non_primary=True)

#manager_map = mapper(Manager, managers, inherits=Employee)
manager_map = mapper(Manager, managers, inherits=p_l_mapper)

session = create_session()

q = session.query(manager_map)
m = q.select()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
logging.getLogger('sqlalchemy.orm').setLevel(logging.DEBUG)

n = m[0].clone()
n.ts = 3
n.name = 'Tommy'
session.save_or_update(n)
session.flush()
