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 =