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 at > http://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.