This is how far I got, before running into a wall: > j = join(ActionMeaning, DepartmentUnit).join(PersonUnit) > disambiguation = { > "UnitID": [j.c.PersonUnit_UnitID, j.c.DepartmentUnit_UnitID], > "DepartmentID": [j.c.DepartmentUnit_DepartmentID, j.c.ActionMeaning_DepartmentID], > } > ActionMeaningToPerson = mapper(ActionMeaning, j, non_primary=True, properties=disambiguation) > PersonAction.meaning = relationship(ActionMeaningToPerson)
ActionMeaning has a DepartmentID -> ForeignKey("DepartmentUnit.DepartmentID") PersonUnit has UnitID -> ForeignKey("DepartmentUnit.UnitID") PersonAction has PersonID -> ForeignKey("PersonUnit.PersonID") This actually does something when I look at PersonAction.meaning, except unfortunately I cannot yet figure out where to express the constraint ActionMeaning.ActionID == PersonAction.ActionID, so I get back all ActionMeanings with a matching DepartmentID, and ActionID of various sorts. I've tried expressing it as the relationship(primaryjoin=), but this gave me: """ ArgumentError: Could not locate any relevant foreign key columns for primary join condition '"ActionMeaning"."ActionID" = "PersonAction"."ActionID"' on relationship PersonAction.meaning. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or are annotated in the join condition with the foreign() annotation. """ Any hints? Thanks again! On 20 October 2014 18:26, Michael Bayer <mike...@zzzcomputing.com> wrote: > > > On Oct 20, 2014, at 1:14 PM, Peter Waller <pe...@scraperwiki.com> wrote: > > > > Hi All, > > > > I am wondering if it is possible to describe in sqlalchemy the > > following relationship with the new features introduced since 0.9.2. > > I've been reading this document and it looks close to what I'm trying > > to achieve: > > > >> > http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#composite-secondary-joins > > > > As does this previous mailing list post: > > > >> https://groups.google.com/d/topic/sqlalchemy/ov-mYWA7XAM/discussion > > > > There is a pre-existing structure to deal with. I would rather not > > change the structure if it can be avoided, but may have to resort to > > doing so. Here are the tables: > > > > TableName (column, ...) > > > >> PersonAction (PersonID, ActionID) > >> PersonUnit (PersonID, UnitID) > >> DepartmentUnit (UnitID, DepartmentID) > >> ActionMeaning (DepartmentID, ActionID) > > So as far as the patterns at > http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html, this one > qualifies for > http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#relationship-to-non-primary-mapper. > The reason is because PersonAction has a direct FK to ActionMeaning > (ActionID) as well as towards elements on what would be “secondary” here, > PersonUnit/DepartmentUnit. The criteria for that is: "we seek to join from > A to B, making use of any number of C, D, etc. in between, however there > are also join conditions between A and B directly.” > > So you map ActionMeaning using a non-primary mapper to a join of > ActionMeaning, DepartmentUnit, and PersonUnit, then PersonAction can relate > to this mapper directly. > > -- > 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 post to this group, send email to sqlalchemy@googlegroups.com. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > -- 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 post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.