[Sqlalchemy-tickets] [sqlalchemy] #2885: reduce for proxied columns when syncing between mappers
Brought to you by:
zzzeek
|
From: sqlalchemy <mi...@zz...> - 2013-12-09 17:03:02
|
#2885: reduce for proxied columns when syncing between mappers
--------------------+---------------------------------------
Reporter: zzzeek | Owner: zzzeek
Type: defect | Status: new
Priority: high | Milestone: 0.9.0
Component: orm | Severity: minor - half an hour
Keywords: | Progress State: needs tests
--------------------+---------------------------------------
this is probably for backport to 0.8 as well
{{{
#!python
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__]).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
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(
- [l for l, r in m._inherits_equated_pairs]):
+ util.reduce(set.union,
+ [l.proxy_set for l, r in
m._inherits_equated_pairs])):
result[table].append((m, m._inherits_equated_pairs))
return result
}}}
--
Ticket URL: <http://www.sqlalchemy.org/trac/ticket/2885>
sqlalchemy <http://www.sqlalchemy.org/>
The Database Toolkit for Python
|