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.