Re: [sqlalchemy] How to link one table to itself?

2010-08-13 Thread Michael Bayer

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 = 

[sqlalchemy] How to link one table to itself?

2010-08-12 Thread Alvaro Reinoso
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!

-- 
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.