It's working properly with that relation:

    mediaGroup = relationship("MediaGroup",
                            secondary=media_group_groups,
order_by="MediaGroup.title",
 
primaryjoin=id==media_group_groups.c.groupA_id,
 
secondaryjoin=id==media_group_groups.c.groupB_id,
                            backref="media_groups")

Thanks!

On Aug 13, 2:15 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Aug 12, 2010, at 1:08 PM, Alvaro Reinoso wrote:
>
>
>
> > Hello,
>
> > I'm trying to link one table to itself. I have media groups which can
> > contain more media group. I created a relation many to many:
>
> >    media_group_groups = Table(
> >                            "media_group_groups",
> >                            metadata,
> >                            Column("groupA_id", Integer, 
> > ForeignKey("media_groups.id")),
> >                            Column("groupB_id", Integer, 
> > ForeignKey("media_groups.id"))
> >                    )
>
> >    class MediaGroup(rdb.Model):
> >            """Represents MediaGroup class. Conteins channels and other media
> > groups"""
> >            rdb.metadata(metadata)
> >            rdb.tablename("media_groups")
>
> >            id = Column("id", Integer, primary_key=True)
> >            title = Column("title", String(100))
> >            parents = Column("parents", String(512))
>
> >            channels = relationship(Channel, secondary=media_group_channels,
> > order_by=Channel.titleView, backref="media_groups")
> >            mediaGroup = relationship("MediaGroup",
> > secondary=media_group_groups, order_by="MediaGroup.title",
> > backref="media_groups")
>
> > I got this error:
>
> > "ArgumentError: Could not determine join condition between parent/
> > child tables on relationship MediaGroup.mediaGroup. Specify a
> > 'primaryjoin' expression. If this is a many-to-many relationship,
> > 'secondaryjoin' is needed as well."
>
> > When I create the tables I don't get any error, it's just when I add
> > any element to it.
> > Any idea???
>
> > Thanks in advance!
>
> because you're having a particularly large amount of difficulty here, I'd 
> very much like to determine what about the documentation or behavior of 
> relationships is continuously leading you down the wrong path - this becuase 
> I myself am not familiar with that many ways to get an error without 
> eventually hitting upon the right solution.   Ive taken the effort to 
> reconstruct every table and relationship you've expressed in this thread.     
> Below you will see an example of everything you've expressed, pretty much 
> using code snippets you've already illustrated plus reconstructions, leading 
> into a persistence scenario that inserts into all seven tables.  I did not 
> come across any of the issues you describe except the initial one expressing 
> that primary/secondaryjoin is needed for MediaGroup.mediaGroup.
>
> Please start by running it as is, against the given sqlite database, so you 
> can see how it works.   Then, I need you to determine what about your setup 
> is different than this, which would pinpoint the source of the issue-  you do 
> this by blending the code below with your app, changing one part at a time 
> until the difference between emitting the error and working properly is 
> localized.   Then, I need to know how to detect the mistake you've been 
> making and to raise a more informative error message.  The "foreign_keys" 
> argument is virtually never needed and at the very least I think I am going 
> to remove the mention of that argument from the message.   Let me know what 
> you come up with.
>
> from sqlalchemy import *
>
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.orm import *
>
> Base = declarative_base()
> metadata = Base.metadata
>
> media_group_groups = Table(
>             "media_group_groups",
>             metadata,
>             Column("groupA_id", Integer, ForeignKey("media_groups.id")),
>             Column("groupB_id", Integer, ForeignKey("media_groups.id"))
>         )
>
> user_media_groups = Table(
>             "user_media_groups",
>             metadata,
>             Column("user_id", Integer, ForeignKey("users.id")),
>             Column("media_group_id", Integer, ForeignKey("media_groups.id")),
>         )
>
> user_channels = Table(
>             "user_channels",
>             metadata,
>             Column("user_id", Integer, ForeignKey("users.id")),
>             Column("channel_id", Integer, ForeignKey("channel.id"))
>         )
>
> media_group_channels = Table(
>             "media_group_channels",
>             metadata,
>             Column("media_group_id", Integer, ForeignKey("media_groups.id")),
>             Column("channel_id", Integer, ForeignKey("channel.id"))
>         )
>
> class Channel(Base):
>     __tablename__ = 'channel'
>     id = Column("id", Integer, primary_key=True)
>     titleView = Column("title", String(100))
>
> class MediaGroup(Base):
>     __tablename__ = "media_groups"
>
>     id = Column("id", Integer, primary_key=True)
>     title = Column("title", String(100))
>     parents = Column("parents", String(512))
>
>     channels = relationship(Channel, secondary=media_group_channels,
>                             order_by=Channel.titleView,
>                             backref="media_groups")
>
>     mediaGroup = relationship("MediaGroup",
>                             secondary=media_group_groups, 
> order_by="MediaGroup.title",
>                             primaryjoin=id==media_group_groups.c.groupA_id,
>                             secondaryjoin=id==media_group_groups.c.groupB_id,
>                             backref="media_groups")
>
> class User(Base):
>     __tablename__ = "users"
>
>     id = Column("id", Integer, primary_key=True)
>     name = Column("name", String(50))
>     email = Column("email", String(50))
>
>     channels = relationship(Channel, secondary=user_channels,
>                                 order_by=Channel.titleView,
>                                 backref="users")
>     mediaGroups = relationship(MediaGroup,
>                             secondary=user_media_groups,
>                                 order_by=MediaGroup.title, backref="users")
>
> engine = create_engine('sqlite://', echo=True)
> metadata.create_all(engine)
>
> sess = sessionmaker(engine)()
>
> m1, m2, m3 = MediaGroup(title='m1'), MediaGroup(title='m2'), 
> MediaGroup(title='m3')
> sess.add_all([m1, m2, m3])
>
> c1, c2 = Channel(titleView='c1'), Channel(titleView='c2')
> m1.channels = [c1, c2]
> m2.channels = [c2]
>
> u1, u2 = User(name='u1'), User(name='u2')
>
> u1.channels= [c1, c2]
> u2.channels = [c1]
>
> u1.mediaGroups = [m2, m3]
> u2.mediaGroups = [m1]
>
> m2.mediaGroup = [m1]
> m3.mediaGroup = [m1]
>
> sess.commit()
>
>
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalch...@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > 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 sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to