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