I tried to use the example from:
http://www.sqlalchemy.org/docs/05/reference/ext/associationproxy.html#simplifying-association-object-relations
But with declarative syntax. Any idea why this is going wrong?
from sqlalchemy import Table, Column, Integer, String, MetaData,
ForeignKey, Sequence, create_engine
from sqlalchemy.orm import relation, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(autoflush=False, bind=engine)
session = Session()
Base = declarative_base()
def _create_uk_by_keyword(keyword):
"""A creator function.
We expect keywords to already be in the DB.. therefore, just
search and return the existing keyword"""
return session.query(Keyword).filter_by(keyword=keyword).one()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
keywords = association_proxy('user_keywords', 'keyword',
creator=_create_uk_by_keyword)
class Keyword(Base):
__tablename__ = 'keywords'
id = Column(Integer, primary_key=True)
keyword = Column(String)
class UserKeyword(Base):
__tablename__ = 'userkeywords'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.id"))
keyword_id = Column(Integer, ForeignKey("keywords.id"))
user = relation(User, backref='user_keywords')
keyword = relation(Keyword)
Base.metadata.create_all(engine)
kw = Keyword(keyword='kw 1')
session.add(kw)
session.flush()
user = User(name='bob')
user.keywords=['kw 1']
which gives me:
user.keywords=['kw 1']
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/ext/associationproxy.py", line 207, in __set__
self._set(proxy, values)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/ext/associationproxy.py", line 259, in _set
proxy.extend(values)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/ext/associationproxy.py", line 394, in extend
self.append(v)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/ext/associationproxy.py", line 386, in append
self.col.append(item)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/collections.py", line 909, in append
item = __set(self, item, _sa_initiator)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/collections.py", line 884, in __set
item = getattr(executor, 'fire_append_event')(item, _sa_initiator)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/collections.py", line 581, in
fire_append_event
return self.attr.fire_append_event(self.owner_state, item,
initiator)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/attributes.py", line 629, in
fire_append_event
value = ext.append(state, value, initiator or self)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/attributes.py", line 815, in append
child_state.get_impl(self.key).append(child_state, state.obj(),
initiator, passive=PASSIVE_NO_CALLABLES)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/attributes.py", line 900, in get_impl
return self.manager.get_impl(key)
File "/usr/local/lib/python2.6/dist-packages/SQLAlchemy-0.5.3-
py2.6.egg/sqlalchemy/orm/attributes.py", line 1317, in get_impl
return self[key].impl
KeyError: 'user'
Thanks.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---