just call configure_mappers() for now, and the need for that step has been removed in b069127b2d3f7b3f2c27f91cf, http://www.sqlalchemy.org/trac/ticket/2935.
On Feb 3, 2014, at 4:12 PM, Matthew Phipps <[email protected]> wrote: > Hi SQLAlchemy, > > On SQLAlchemy 0.9.2, if I construct a query selecting a composite property > before constructing any other queries, I see this error: > > Traceback (most recent call last): > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/nose/case.py", > line 197, in runTest > self.test(*self.arg) > File "/media/psf/vagrant/test_configure_mappers.py", line 47, in > test_composite_prop_query > user_login_query = Session.query(User.login) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", > line 149, in do > return getattr(self.registry(), name)(*args, **kwargs) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/session.py", > line 1151, in query > return self._query_cls(entities, self, **kwargs) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", > line 106, in __init__ > self._set_entities(entities) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", > line 114, in _set_entities > entity_wrapper(self, ent) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", > line 3338, in __init__ > column = column._query_clause_element() > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", > line 150, in _query_clause_element > return self.comparator._query_clause_element() > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/descriptor_props.py", > line 407, in _query_clause_element > return CompositeProperty.CompositeBundle(self.prop, > self.__clause_element__()) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/descriptor_props.py", > line 404, in __clause_element__ > return expression.ClauseList(group=False, *self._comparable_elements) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", > line 689, in __get__ > obj.__dict__[self.__name__] = result = self.fget(obj) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/descriptor_props.py", > line 419, in _comparable_elements > return self.prop._comparable_elements > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", > line 689, in __get__ > obj.__dict__[self.__name__] = result = self.fget(obj) > File > "/home/badmin/.virtualenvs/bridge-it/local/lib/python2.7/site-packages/sqlalchemy/orm/descriptor_props.py", > line 236, in _comparable_elements > for prop in self.props > AttributeError: 'CompositeProperty' object has no attribute 'props' > > I've written a nose test module that exposes this behavior. Note that no SQL > is ever actually issued (AFAIK?). > > import logging > > from sqlalchemy import create_engine, Column, Integer, String > from sqlalchemy.orm import composite, sessionmaker, configure_mappers, > scoped_session > from sqlalchemy.ext.declarative import declarative_base > > engine = create_engine('sqlite:///:memory:') > session_factory = sessionmaker(bind=engine) > Session = scoped_session(session_factory) > Base = declarative_base() > logging.basicConfig() > logging.getLogger('sqlalchemy.orm').setLevel(logging.INFO) > > > class Login(object): > > def __init__(self, name, password): > self.name = name > self.password = password > > def __composite_values__(self): > return self.name, self.password > > > class User(Base): > __tablename__ = 'users' > > id = Column(Integer, primary_key=True) > name = Column(String) > fullname = Column(String) > password = Column(String) > > login = composite(Login, name, password) > > def __repr__(self): > return "<User(name='%s', fullname='%s', password='%s')>" % ( > self.name, self.fullname, self.password) > > > class TestConfigureMappers(object): > > def tearDown(self): > Session.remove() > > # This fails > def test_composite_prop_query(self): > user_login_query = Session.query(User.login) > > # This works > def test_composite_prop_query_configuring_first(self): > > # Either of these two lines will suffice > user_query = Session.query(User) > #configure_mappers() > > user_login_query = Session.query(User.login) > user_login = user_login_query > > Is this expected behavior? I figure that configure_mappers() must be exposed > publicly for a reason, but the docs say querying should be good enough to > invoke this process: > http://docs.sqlalchemy.org/en/latest/changelog/migration_07.html?highlight=configure_mappers#compile-mappers-renamed-configure-mappers-simplified-configuration-internals > . > > Thanks, > Matt > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/groups/opt_out.
signature.asc
Description: Message signed with OpenPGP using GPGMail
