To avoid writing a function selecting the correct class for a 'type' value, 
I would like to create models using the parent class ('Employee') and 
'type' instead of using the child class ('Manager', 'Engineer') in the 
first place. I noticed that the resulting object is not of the respecting 
child class (e.g. 'Manager'), even after re-querying it with the child 
class or with with_polymorphic. However, only in a new session this works 
out. Is there a way to achieve this without opening a new session?

Here is my example script - I am using sqlalchemy version 1.4.37:

from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import declarative_base, \
    relationship, sessionmaker

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()

class Employee(Base):
    __tablename__ = "employee"
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    type = Column(String(50))

    __mapper_args__ = {
        "polymorphic_identity": "employee",
        "polymorphic_on": type,
        'with_polymorphic': '*'
    }

class Manager(Employee):
    manager_data = Column(String(50))

    __mapper_args__ = {
        "polymorphic_identity": "manager"
    }

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
manager = Employee(name='name of Manager', type='manager')
session.add(manager)
session.flush()
manager_id = manager.id
session.commit()

# doesn't work:
m0 = session.query(Employee).filter_by(id=manager_id).first()
print(">>", m0.__mapper_args__['polymorphic_identity'])
try:
    print(m0.manager_data)
except:
    print(">> didn't work")

# doesn't work:
m = session.query(Manager).filter_by(id=manager_id).first()
print(">>", m.__mapper_args__['polymorphic_identity'])
try:
    print(m.manager_data)
except:
    print(">> didn't work")

# works:
session.close()
session2 = Session()
m1 = session2.query(Employee).filter_by(id=manager_id).first()
print(">>", m1.__mapper_args__['polymorphic_identity'])
print(m1.manager_data)

# works:
m = session2.query(Manager).filter_by(id=manager_id).first()
print(">>", m.__mapper_args__['polymorphic_identity'])
print(m.manager_data)

session2.close()

Thanks,
David

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/313009f4-c066-4746-ae8a-a285526c3e7an%40googlegroups.com.

Reply via email to