Sqlalchemy Joined Inheritance Query Based On Mixin Column
I have a declarative class structure that looks like this: class BaseClass(Base):       Column A       Column B  class Mixin(object):       Column C  class ItemA(BaseClass):
Solution 1:
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import inspect
Base = declarative_base()
class BaseClass(Base):
    __tablename__ = 'base'
    id = Column(Integer, primary_key=True)
    type = Column(String)
    a = Column(Integer)
    b = Column(Integer)
    __mapper_args__ = {"polymorphic_on": type}
class Mixin(object):
    c = Column(Integer)
class ItemA(BaseClass):
    __tablename__ = 'a'
    id = Column(ForeignKey('base.id'), primary_key=True)
    d = Column(Integer)
    __mapper_args__ = {"polymorphic_identity": 'a'}
class ItemB(Mixin, BaseClass):
    __tablename__ = 'b'
    id = Column(ForeignKey('base.id'), primary_key=True)
    __mapper_args__ = {"polymorphic_identity": 'b'}
class ItemC(Mixin, BaseClass):
    __tablename__ = 'c'
    id = Column(ForeignKey('base.id'), primary_key=True)
    e = Column(Integer)
    __mapper_args__ = {"polymorphic_identity": 'c'}
e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)
def magic_w_poly(base):
    insp = inspect(base)
    w_poly = []
    crit = []
    for mapper in insp.self_and_descendants:
        if "c" in mapper.c:
            w_poly.append(mapper)
            crit.append(mapper.c.c)
    w_col_c = with_polymorphic(base, w_poly)
    def comparator(value):
        return or_(
                    crit_elem == value
                    for crit_elem in crit
                )
    return w_col_c, comparator
s = Session(e)
w_col, comp = magic_w_poly(BaseClass)
print s.query(w_col).filter(comp(35))
query at the end:
SELECT base.id AS base_id, base.type AS base_type, base.a AS base_a, base.b AS base_b, b.id AS b_id, b.c AS b_c, c.id AS c_id, c.c AS c_c, c.e AS c_e 
FROM base LEFT OUTER JOIN b ON base.id = b.id LEFT OUTER JOIN c ON base.id = c.id 
WHERE b.c = :c_1 OR c.c = :c_2
Post a Comment for "Sqlalchemy Joined Inheritance Query Based On Mixin Column"