On Tuesday, March 11, 2014 4:39:54 PM UTC-7, Michael Bayer wrote: > > you need to name the “secondary” table as it’s name in the MetaData > collection, not the variable name you’ve assigned it to, when configuring > with string arguments. > > > On Mar 11, 2014, at 6:50 PM, Bala <bal...@gmail.com <javascript:>> wrote: > > Hi Michael, thanks for the prompt reply. > > However, When I tried according to the suggestion, I get this error: > > 45 class Groups(ModelBase, VersionColumnMixin): > 46 domain_id = sa.Column(sa.String(36), > DefaultClause('default'), nullable=False) > 47 description = sa.Column(sa.Text) > 48 date_created = sa.Column(sa.DateTime) > 49 group_name = sa.Column(sa.String(64), nullable=False, > index=True) > 50 child_groups = relationship('Groups', > secondary=groups_and_groups_assoc_table, > 51 primaryjoin= > *"Groups.id==groups_and_groups_assoc_table.c.parent_group_id"*, > 52 secondaryjoin= > *"Groups.id==groups_and_groups_assoc_table.c.child_group_id"*, > 53 backref='parent_groups') > 54 __table_args__ = (sa.UniqueConstraint('domain_id', > 'group_name'),) > > Traceback (most recent call last): > File "./selfref4.py", line 67, in <module> > g1 = Groups(description='1234', group_name='group1') > File "<string>", line 2, in __init__ > File > "/usr/lib64/python2.6/site-packages/sqlalchemy/orm/instrumentation.py", > line 322, in _new_state_if_none > state = self._state_constructor(instance, self) > File > "/usr/lib64/python2.6/site-packages/sqlalchemy/util/langhelpers.py", line > 689, in __get__ > obj.__dict__[self.__name__] = result = self.fget(obj) > ... > ...File > "/usr/lib64/python2.6/site-packages/sqlalchemy/ext/declarative/clsregistry.py", > > line 275, in __call__ > (self.prop.parent, self.arg, n.args[0], self.cls) > *sqlalchemy.exc.InvalidRequestError:* When initializing mapper > Mapper|Groups|groups, expression > 'Groups.id==groups_and_groups_assoc_table.c.parent_group_id' failed to > locate a name ("name 'groups_and_groups_assoc_table' is not defined"). If > this is a class name, consider adding this relationship() to the <class > '__main__.Groups'> class after both dependent classes have been defined. > > > > > On Tuesday, March 11, 2014 2:10:52 PM UTC-7, Michael Bayer wrote: >> >> >> On Mar 11, 2014, at 3:50 PM, Bala <bal...@gmail.com> wrote: >> >> 45 class Groups(ModelBase, VersionColumnMixin): >> 46 *id = sa.Column('id', sa.Integer, Sequence('id_seq'), >> primary_key=True)* >> 47 domain_id = sa.Column(sa.String(36), >> DefaultClause('default'), nullable=False) >> 48 description = sa.Column(sa.Text) >> 49 date_created = sa.Column(sa.DateTime) >> 50 group_name = sa.Column(sa.String(64), nullable=False, >> index=True) >> 51 child_groups = relationship('Groups', >> secondary=groups_and_groups_assoc_table, >> 52 >> primaryjoin=id==groups_and_groups_assoc_table.c.parent_group_id, >> 53 >> secondaryjoin=id==groups_and_groups_assoc_table.c.child_group_id, >> 54 backref='parent_groups’) >> >> >> here, when the definition of the Python identifier “id” within the Groups >> class definition is removed, it is no longer valid to refer to the word >> “id” within the “primaryjoin” and “secondaryjoin” conditions, as “id” is >> not defined. The reason it seems to be defined is that it is resolving to >> the Python built in function “id”. Unfortunately the exception message >> isn’t being too smart here, interpreting “id” as just another literal value >> like the number “3” so you don’t see it, it wouldn’t be a bad idea for SQLA >> to detect this kind of thing but that is actually somewhat difficult as it >> is valid for an expression to refer to a callable. >> >> Since “id” is not yet defined within the class body of Groups you need to >> specify conditions using a string: >> >> class Groups(ModelBase, VersionColumnMixin): >> domain_id = sa.Column(sa.String(36), DefaultClause('default'), >> nullable=False) >> description = sa.Column(sa.Text) >> date_created = sa.Column(sa.DateTime) >> group_name = sa.Column(sa.String(64), nullable=False, index=True) >> child_groups = relationship('Groups', >> secondary=groups_and_groups_assoc_table, >> >> primaryjoin="Groups.id==groups_and_groups.c.parent_group_id", >> >> secondaryjoin="Groups.id==groups_and_groups.c.child_group_id", >> backref='parent_groups') >> __table_args__ = (sa.UniqueConstraint('domain_id', 'group_name'),) >> >> >> i’m updating the document at >> http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#self-referential-many-to-many-relationshipto >> include this form now. >> >> >> >> >> >> > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com<javascript:> > . > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > > >
-- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.