Thanks - sort knew what was needed - didn't know how to express it. Nick
On Mar 24, 10:20 pm, Michael Bayer <[email protected]> wrote: > On Mar 24, 2011, at 5:08 PM, Nickle wrote: > > > > > > > > > > > Doesn't quite work. > > > What I think is the problem is that when using secondary on the > > association table, there are two foreign keys both referencing a > > calendar. It doesn't know which to pick. > > > union mapper looks like this > > > union_calendar_mapper = \ > > mapper \ > > ( > > UnionCalendar, > > inherits=calendar_mapper, > > polymorphic_identity='union', > > properties = > > { > > 'children':relationship(Calendar, > > secondary='calendar_children_table') > > } > > ) > > oh thats correct, so "primaryjoin" and "secondaryjoin" clear that up, also > you pass the Table object itself to "secondary" without the string: > > relationship(Calendar, secondary=calendar_children_table, > > primaryjoin=calendar_children_table.c.parent_id=calendars_table.c.id, > > secondaryjoin=calendar_children_table.c.child_id=calendars_table.c.id > ) > > so it knows UnionCalendar id 12 linked to Calendar id 17, put the "12" in > "parent_id", put the "17" in "child_id". Similarly it knows which side is > which inside a query(UnionCalendar).join("children"). > > > > > > > > > > > On Mar 24, 4:29 pm, Michael Bayer <[email protected]> wrote: > >> On Mar 24, 2011, at 4:40 AM, Nickle wrote: > > >>> I'm trying to implement a Composite > >>> Pattern,http://en.wikipedia.org/wiki/Composite_pattern > > >>> In this case its to represent some holiday calendars. I need to > >>> implement a union calendar that is a collection of other calendars. > > >>> So a straightforward hierarchy. Calendar, abstract as the top level > >>> class. SimpleCalendar that inherits from Calendar. Then a union > >>> calendar that inherits from Calendar, but I need to implement > >>> children, a collection of calendars. > > >>> So its a self referential hierarchy. The point to note is that one > >>> calendar can appear in more than one union calendar, so its a self > >>> referential many to many. Its certain I need an association table as a > >>> result. > > >>> I'm not quite sure how to configure this. > > >>> I'm trying something along these lines > > >>> calendars_table = Table \ > >>> ( > >>> 'calendars', > >>> metadata, > >>> Column ('id', Integer, primary_key=True), > >>> Column ('code', String, nullable=False, unique=True), > >>> Column ('name', String), > >>> Column ('calendar_type', String (20), nullable=False), > >>> Column ('monday', Boolean), > >>> Column ('tuesday', Boolean), > >>> Column ('wednesday', Boolean), > >>> Column ('thurday', Boolean), > >>> Column ('friday', Boolean), > >>> Column ('saturday', Boolean), > >>> Column ('sunday', Boolean) > >>> ) > > >>> calendar_children_table = Table \ > >>> ( > >>> 'calendar_children', > >>> metadata, > >>> Column ('parent_id', Integer, ForeignKey ('calendars.id')), > >>> Column ('child_id', Integer, ForeignKey ('calendars.id')) > >>> ) > > >>> calendar_mapper = mapper (Calendar, calendars_table, > >>> polymorphic_on=calendars_table.c.calendar_type, > >>> polymorphic_identity="calendar") > >>> simple_calendar_mapper = mapper (SimpleCalendar, > >>> inherits=calendar_mapper, > >>> polymorphic_identity='simple',properties={'holidays':relationship(Holiday, > >>> backref='calendar')}) > >>> union_calendar_mapper = mapper (UnionCalendar, > >>> inherits=calendar_mapper, polymorphic_identity='union') > > >>> holidays_table = Table \ > >>> ( > >>> 'holidays', > >>> metadata, > >>> Column ('id', Integer, primary_key=True), > >>> Column ('holiday_type', String(20), nullable=False), > >>> Column ('calendar_id', Integer, ForeignKey ('calendars.id')), > >>> Column ('description', String ), > >>> Column ('year', Integer), > >>> Column ('month', Integer), > >>> Column ('day', Integer) > >>> ) > > >>> holiday_mapper = mapper (Holiday, holidays_table, > >>> polymorphic_on=holidays_table.c.holiday_type, > >>> polymorphic_identity='holiday') > >>> repeating_holiday_mapper = mapper (RepeatingHoliday, > >>> inherits=holiday_mapper, polymorphic_identity='repeating') > >>> simple_holiday_mapper = mapper (SimpleHoliday, > >>> inherits=holiday_mapper, polymorphic_identity='simple') > > >>> However, I'm not sure how to map the relationships with the > >>> association table. > > >>> Points that I think are relevant are > > >>> 1. It's only the UnionCalendar that has children. > > >> apply a relatlonship() to the UnionCalendar mapping, the target class is > >> Calendar, "secondary" is calendar_children_table. > > >>> 2. Deleting a UnionCalendar should delete the entries in the > >>> association table, but not the children calendars. > > >> This is a given when using "secondary" with relationship. Severing the > >> link between parent and child corresponds to a deletion of the row in > >> "secondary". > > >>> 3. Navigation is really only needed from the parent UnionCalendar to > >>> the underlying children calendars. However, having a collection back > >>> the other way might have some uses. > > >> just add "backref='parent_containers'" or similar to the relationship(). > > >>> 4. For SimpleCalender to its Holidays, I haven't yet implemented the > >>> cascaded delete, but I know how to do this. > > >>> Thanks > > >>> Nick > > >>> -- > >>> You received this message because you are subscribed to the Google Groups > >>> "sqlalchemy" group. > >>> To post to this group, send email to [email protected]. > >>> To unsubscribe from this group, send email to > >>> [email protected]. > >>> For more options, visit this group > >>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]. > > For more options, visit this group > > athttp://groups.google.com/group/sqlalchemy?hl=en. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
