Yes, again some polymorphic loading stuff that doesn't work as I'd
expect. This time it's 'Single Table Inheritance' and 'Concrete Table
Inheritance'. The comments in the attached files give more details on that.
This stuff is absolutely non-critical to me as i use 'Multiple Table
Inheritance' for now, just stumbled upon it while i prepared the doc patch.
Sol.
from sqlalchemy import *
db = create_engine("sqlite:///:memory:")
metadata = BoundMetaData(db)
session = create_session()
class Employee(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return self.__class__.__name__ + " " + self.name
class Manager(Employee):
def __init__(self, name, manager_data):
self.name = name
self.manager_data = manager_data
def __repr__(self):
return self.__class__.__name__ + " " + self.name + " " + self.manager_data
class Engineer(Employee):
def __init__(self, name, engineer_info):
self.name = name
self.engineer_info = engineer_info
def __repr__(self):
return self.__class__.__name__ + " " + self.name + " " + self.engineer_info
managers_table = Table('managers', metadata,
Column('employee_id', Integer, primary_key=True),
Column('name', String(50)),
Column('manager_data', String(50)),
).create()
engineers_table = Table('engineers', metadata,
Column('employee_id', Integer, primary_key=True),
Column('name', String(50)),
Column('engineer_info', String(50)),
).create()
pjoin = polymorphic_union({
'manager':managers_table,
'engineer':engineers_table
}, 'type', 'pjoin')
employee_mapper = mapper(Employee, pjoin, polymorphic_on=pjoin.c.type)
manager_mapper = mapper(Manager, managers_table, inherits=employee_mapper, concrete=True, polymorphic_identity='manager')
engineer_mapper = mapper(Engineer, engineers_table, inherits=employee_mapper, concrete=True, polymorphic_identity='engineer')
session.save(Manager('Tom', 'knows how to manage things'))
session.save(Engineer('Kurt', 'knows how to hack'))
session.flush()
# this gives you [Engineer Kurt knows how to hack, Manager Tom knows how to manage things]
# as it should be
session.query(Employee).select()
# this fails
session.query(Engineer).select()
# this fails
session.query(Manager).select()
from sqlalchemy import *
db = create_engine("sqlite:///:memory:")
metadata = BoundMetaData(db)
session = create_session()
class Employee(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return self.__class__.__name__ + " " + self.name
class Manager(Employee):
def __init__(self, name, manager_data):
self.name = name
self.manager_data = manager_data
def __repr__(self):
return self.__class__.__name__ + " " + self.name + " " + self.manager_data
class Engineer(Employee):
def __init__(self, name, engineer_info):
self.name = name
self.engineer_info = engineer_info
def __repr__(self):
return self.__class__.__name__ + " " + self.name + " " + self.engineer_info
employees_table = Table('employees', metadata,
Column('employee_id', Integer, primary_key=True),
Column('name', String(50)),
Column('manager_data', String(50)),
Column('engineer_info', String(50)),
Column('type', String(20))
)
employee_mapper = mapper(Employee, employees_table, polymorphic_on=employees_table.c.type)
manager_mapper = mapper(Manager, inherits=employee_mapper, polymorphic_identity='manager')
engineer_mapper = mapper(Engineer, inherits=employee_mapper, polymorphic_identity='engineer')
employees_table.create()
session.save(Manager('Tom', 'knows how to manage things'))
session.save(Engineer('Kurt', 'knows how to hack'))
session.flush()
# this gives you [Engineer Kurt knows how to hack, Manager Tom knows how to manage things]
# as it should be
session.query(Employee).select()
# this gives you [Engineer Kurt knows how to hack, Manager Tom knows how to manage things]
# instead of [Engineer Kurt knows how to hack]
session.query(Engineer).select()
# this gives you [Engineer Kurt knows how to hack, Manager Tom knows how to manage things]
# instead of [Manager Tom knows how to manage things]
session.query(Manager).select()
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users