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
-~----------~----~----~----~------~----~------~--~---

Reply via email to