the error message here isn't fantastic but I think you mean to say: oa = ObjectAssociation() o2.relate_down.append(oa) o.relate_up.append(oa)
as relate_up/relate_down accept ObjectAssociation objects, not Object objects, as members. On Aug 26, 2:53 pm, Thomas Jacob <ja...@internet24.de> wrote: > Hello List > > I'd like to define a many-to-many relationship using the declarative > syntax between a table to itself, but employing an association > object (since I require the association to have attributes > also). > > Here's what I tried: > > #================================================================= > > from sqlalchemy import * > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy.orm import sessionmaker, relation, backref > > DB_engine = create_engine('sqlite:///:memory:', echo=True) > DB_Base = declarative_base(bind=DB_engine) > DB_Session = sessionmaker() > DB_Session.configure(bind=DB_engine) > DB_session = DB_Session() > > class Object(DB_Base): > __tablename__ = 'object' > > object_id = Column(Integer, primary_key=True) > label = Column(Text) > > class ObjectAssociation(DB_Base): > __tablename__ = 'object_association' > __table_args__ = ( > PrimaryKeyConstraint('left_object_id', 'right_object_id'), > {} > ) > > left_object_id = Column(Integer, ForeignKey('object.object_id')) > right_object_id = Column(Integer, ForeignKey('object.object_id')) > label = Column(Text) > > left_object = relation(Object, > primaryjoin=(left_object_id==Object.object_id), > backref=backref("relate_down") > ) > right_object = relation(Object, > primaryjoin=(right_object_id==Object.object_id), > backref=backref("relate_up") > ) > > DB_Base.metadata.create_all() > > o = Object() > o.label = 'Object1' > > o2 = Object() > o2.label = 'Object2' > > o2.relate_down.append(o) > > DB_session.commit() > > #================================================================= > > But this raises an exception: > > #================================================================= > > 2011-08-26 20:48:28,422 INFO sqlalchemy.engine.base.Engine PRAGMA > table_info("object") > 2011-08-26 20:48:28,422 INFO sqlalchemy.engine.base.Engine () > 2011-08-26 20:48:28,422 INFO sqlalchemy.engine.base.Engine PRAGMA > table_info("object_association") > 2011-08-26 20:48:28,422 INFO sqlalchemy.engine.base.Engine () > 2011-08-26 20:48:28,423 INFO sqlalchemy.engine.base.Engine > CREATE TABLE object ( > object_id INTEGER NOT NULL, > label TEXT, > PRIMARY KEY (object_id) > ) > > 2011-08-26 20:48:28,423 INFO sqlalchemy.engine.base.Engine () > 2011-08-26 20:48:28,423 INFO sqlalchemy.engine.base.Engine COMMIT > 2011-08-26 20:48:28,423 INFO sqlalchemy.engine.base.Engine > CREATE TABLE object_association ( > left_object_id INTEGER, > right_object_id INTEGER, > label TEXT, > PRIMARY KEY (left_object_id, right_object_id), > FOREIGN KEY(left_object_id) REFERENCES object (object_id), > FOREIGN KEY(right_object_id) REFERENCES object (object_id) > ) > > 2011-08-26 20:48:28,423 INFO sqlalchemy.engine.base.Engine () > 2011-08-26 20:48:28,424 INFO sqlalchemy.engine.base.Engine COMMIT > Traceback (most recent call last): > File "bug.py", line 53, in <module> > o2.relate_down.append(o) > File > "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/collections.py", > line 952, in append > item = __set(self, item, _sa_initiator) > File > "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/collections.py", > line 927, in __set > item = getattr(executor, 'fire_append_event')(item, _sa_initiator) > File > "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/collections.py", > line 618, in fire_append_event > item, initiator) > File > "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/attributes.py", > line 745, in fire_append_event > value = fn(state, value, initiator or self) > File > "/usr/local/lib/python2.6/dist-packages/sqlalchemy/orm/attributes.py", > line 943, in emit_backref_from_collection_append_event > child_state.manager[key].impl.append( > KeyError: 'left_object' > > #=================================================================== > > Is this a bug? Am I doing something wrong? > > Any clue as to what is going on here would be greatly appreciated. > > The platform I ran this on was Ubuntu 10.04's Python 2.6.5 + SQLAlchemy > 0.7.2. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@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.