reduce for proxied columns when syncing between mappers

Issue #2885 resolved
Mike Bayer repo owner created an issue

this is probably for backport to 0.8 as well

from sqlalchemy import select, Table, Column, Integer, ForeignKey, create_engine, Text, Float
from sqlalchemy.orm import Session
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Person(Base):
    __table_actual__ = Table('person', Base.metadata,
                             Column('id', Integer, primary_key=True),
                             Column('name', Text),
                             Column('type', Text)
                             )
    __table__ = select([__table_actual__](__table_actual__)).alias("person_alias")

    __mapper_args__ = {"polymorphic_on": __table__.c.type, "polymorphic_identity": "Person"}

class Golfer(Person):
    __tablename__ = "golfer"
    id_person = Column(Integer, ForeignKey(Person.__table_actual__.c.id), primary_key=True)
    handicap = Column(Float)
    __mapper_args__ = {"polymorphic_identity": "Golfer"}

engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)
session = Session(engine)

p1 = Person(name="Joe Bloggs")
session.add(p1)

g1 = Golfer(name="Tiger Woods", handicap=2.5)
session.add(g1)
session.commit()

print(g1.name)

patch:

diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index b3b872f..bdaeca0 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -2488,7 +2488,8 @@ class Mapper(_InspectionAttr):
             for m in self.iterate_to_root():
                 if m._inherits_equated_pairs and \
                     cols.intersection(
-                        [for l, r in m._inherits_equated_pairs](l)):
+                        util.reduce(set.union,
+                          [for l, r in m._inherits_equated_pairs](l.proxy_set))):
                     result[table](table).append((m, m._inherits_equated_pairs))

         return result

Comments (2)

  1. Log in to comment