Thanks for the tip Michael, that solved my problem! It now looks like:
category_association = Table('BankCategoryMap',
Base.metadata,
Column("ParentCategoryID", Integer,
ForeignKey('BankCategories.ID'), primary_key=True),
Column("ChildCategoryID", Integer,
ForeignKey('BankCategories.ID'), primary_key=True))
class Category(Base):
__tablename__ = 'BankCategories'
id = Column("ID", Integer, primary_key=True)
name = Column("Name", String)
description = Column("Description", String)
active = Column("Active", SmallInteger)
parents = relationship("Category",
secondary=category_association,
primaryjoin="Category.id ==
BankCategoryMap.c.ChildCategoryID",
secondaryjoin="BankCategoryMap.c.ParentCategoryID == Category.id",
backref='children')
Which works just dandy.
Thanks again,
Doug
On Mar 3, 3:07 pm, Michael Bayer <[email protected]> wrote:
> On Mar 3, 2011, at 5:11 PM, Doug wrote:
>
>
>
> > Hello all,
>
> > I've just started using SQLAlchemy recently (and it's been great) but
> > I have run into a problem recently. I am trying to map a table back to
> > itself via a second many-to-many table in a declarative fashion. I
> > have this working as so (mapper configuration):
>
> > However, when I try it the Declarative way:
>
> > category_association = Table('BankCategoryMap',
> > Base.metadata,
> > Column("ParentCategoryID", Integer,
> > ForeignKey('BankCategories.ID'), primary_key=True),
> > Column("ChildCategoryID", Integer,
> > ForeignKey('BankCategories.ID'), primary_key=True))
>
> > class Category(Base):
> > __tablename__ = 'BankCategories'
>
> > id = Column("ID", Integer, primary_key=True)
> > name = Column("Name", String)
> > description = Column("Description", String)
> > active = Column("Active", SmallInteger)
>
> > parents = relationship("Category",
> > secondary=category_association,
> > primaryjoin="BankCategories.ID" ==
> > category_association.c.ChildCategoryID,
>
> > secondaryjoin=category_association.c.ParentCategoryID ==
> > "BankCategories.ID",
> > backref='children')
>
> You need to use the actual attributes, or a full string, when using the
> primaryjoin and secondaryjoin arguments. You can't mix and match operators
> with strings. Some FAQ on a similar issue is here:
> http://www.sqlalchemy.org/trac/wiki/FAQ#ImusingDeclarativeandsettingp....
>
>
>
> > This does not work and I get the following error:
>
> > File '/home/doug/pyenv_svn/CreateService/surveyservice/surveyservice/
> > controllers/error.py', line 25 in document
> > cat.parents
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/attributes.py', line 170 in
> > __get__
> > instance_dict(instance))
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/attributes.py', line 390 in
> > get
> > value = callable_(passive=passive)
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/strategies.py', line 670 in
> > __call__
> > result = q.all()
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/query.py', line 1576 in all
> > return list(self)
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/query.py', line 1688 in
> > __iter__
> > return self._execute_and_instances(context)
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/query.py', line 1693 in
> > _execute_and_instances
> > mapper=self._mapper_zero_or_none())
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/session.py', line 729 in
> > execute
> > clause, params or {})
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/engine/base.py', line 1191 in
> > execute
> > params)
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/engine/base.py', line 1269 in
> > _execute_clauseelement
> > parameters=params
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/engine/base.py', line 1377 in
> > __create_execution_context
> > connection=self, **kwargs)
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/engine/default.py', line 388 in
> > __init__
> > grp,m in enumerate(parameters)]
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/sql/compiler.py', line 291 in
> > construct_params
> > pd[self.bind_names[bindparam]] = bindparam.value()
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/strategies.py', line 447 in
> > <lambda>
> > state, dict_, bind_to_col[bindparam.key])
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/mapper.py', line 1303 in
> > _get_state_attr_by_column
> > return self._columntoproperty[column]._getattr(state, dict_, column,
> > passive=passive)
> > File '/home/doug/pyenv_svn/CreateService/lib/python2.6/site-packages/
> > SQLAlchemy-0.6.5-py2.6.egg/sqlalchemy/orm/mapper.py', line 2510 in
> > __missing__
> > (column, self.mapper))
> > UnmappedColumnError: No column :ChildCategoryID_1 is configured on
> > mapper Mapper|Category|BankCategories...
>
> > Any idea/help on why I'm getting the UnmappedColumnError?
>
> > Thanks,
> > Doug
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "sqlalchemy" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected].
> > 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.