Hello,

  I am trying apply the order_by method on a query with a mapper that
uses eager loading.

mapper(User, users_table, properties = {
        'addresses' : relation(Address, backref=backref('user',
lazy=False))
    })
...
session.query(Address).order_by(asc(User.c.user_name)).select()

When doing the outer join an alias is applied to the users table. So
it is not able to map the column specified in the order_by attribute.

sqlalchemy.exceptions.SQLError: (OperationalError) no such column:
users.user_name u'SELECT  ....
FROM addresses LEFT OUTER JOIN users AS anon_62c6

I saw the documentation:
Combining Eager Loads with Result Set Mappings
http://www.sqlalchemy.org/docs/adv_datamapping.html#advdatamapping_resultset_combining

But not sure I understand it.
Is it possible to use order_by without creating explicitly an outer
join, alias, and the option contains_eager?
Is there an option to avoid labeling the related tables with
anon_XXXX?

complete example below.

cheers,
  Eduardo

---------
from sqlalchemy import *

metadata = MetaData()

# a table to store users
users_table = Table('users', metadata,
    Column('user_id', Integer, primary_key = True),
    Column('user_name', String(40)),
    Column('password', String(80))
)

# a table that stores mailing addresses associated with a specific
user
addresses_table = Table('addresses', metadata,
    Column('address_id', Integer, primary_key = True),
    Column('user_id', Integer, ForeignKey("users.user_id")),
    Column('street', String(100)),
    Column('city', String(80)),
    Column('state', String(2)),
    Column('zip', String(10))
)

class User(object):
    pass
class Address(object):
    pass

mapper(Address, addresses_table)
mapper(User, users_table, properties = {
        'addresses' : relation(Address, backref=backref('user',
lazy=False))
    })

# engine
engine = create_engine("sqlite://mydb.db")
metadata.create_all(engine)
# session
session = create_session(bind_to=engine)

### test ordering
engine.echo = True

# order by column on same table works fine.
session.query(Address).order_by(asc(Address.c.zip)).select()

# order by column on different table doesnt work.
session.query(Address).order_by(asc(User.c.user_name)).select()

--------------------
2007-07-11 01:33:06,683 INFO sqlalchemy.engine.base.Engine.0x..90
SELECT addresses.city AS addresses_city, addresses.address_id AS
addresses_address_id, addresses.user_id AS addresses_user_id,
addresses.zip AS addresses_zip, addresses.state AS addresses_state,
addresses.street AS addresses_street, anon_62c6.user_name AS
anon_62c6_user_name, anon_62c6.password AS anon_62c6_password,
anon_62c6.user_id AS anon_62c6_user_id
FROM addresses LEFT OUTER JOIN users AS anon_62c6 ON anon_62c6.user_id
= addresses.user_id ORDER BY addresses.zip ASC, anon_62c6.oid
2007-07-11 01:33:06,684 INFO sqlalchemy.engine.base.Engine.0x..90 []
2007-07-11 01:33:06,696 INFO sqlalchemy.engine.base.Engine.0x..90
SELECT addresses.city AS addresses_city, addresses.address_id AS
addresses_address_id, addresses.user_id AS addresses_user_id,
addresses.zip AS addresses_zip, addresses.state AS addresses_state,
addresses.street AS addresses_street, anon_62c6.user_name AS
anon_62c6_user_name, anon_62c6.password AS anon_62c6_password,
anon_62c6.user_id AS anon_62c6_user_id
FROM addresses LEFT OUTER JOIN users AS anon_62c6 ON anon_62c6.user_id
= addresses.user_id ORDER BY users.user_name ASC, anon_62c6.oid
2007-07-11 01:33:06,697 INFO sqlalchemy.engine.base.Engine.0x..90 []
2007-07-11 01:33:06,698 INFO sqlalchemy.engine.base.Engine.0x..90
ROLLBACK
Traceback (most recent call last):
  File "testesa.py", line 45, in ?
    session.query(Address).order_by(asc(User.c.user_name)).select()
  File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py",
line 319, in select
    return self.select_whereclause(whereclause=arg, **kwargs)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py",
line 326, in select_whereclause
    return self._select_statement(statement, params=params)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py",
line 996, in _select_statement
    return self.execute(statement, params=params, **kwargs)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/query.py",
line 896, in execute
    result = self.session.execute(self.mapper, clauseelement,
params=params)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/orm/session.py",
line 183, in execute
    return self.connection(mapper,
close_with_result=True).execute(clause, params, **kwargs)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py",
line 520, in execute
    return Connection.executors[c](self, object, *multiparams,
**params)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py",
line 560, in execute_clauseelement
    return self.execute_compiled(elem.compile(dialect=self.dialect,
parameters=param), *multiparams, **params)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py",
line 571, in execute_compiled
    self._execute_raw(context)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py",
line 584, in _execute_raw
    self._execute(context)
  File "/usr/lib/python2.4/site-packages/sqlalchemy/engine/base.py",
line 602, in _execute
    raise exceptions.SQLError(context.statement, context.parameters,
e)
sqlalchemy.exceptions.SQLError: (OperationalError) no such column:
users.user_name u'SELECT addresses.city AS addresses_city,
addresses.address_id AS addresses_address_id, addresses.user_id AS
addresses_user_id, addresses.zip AS addresses_zip, addresses.state AS
addresses_state, addresses.street AS addresses_street,
anon_62c6.user_name AS anon_62c6_user_name, anon_62c6.password AS
anon_62c6_password, anon_62c6.user_id AS anon_62c6_user_id \nFROM
addresses LEFT OUTER JOIN users AS anon_62c6 ON anon_62c6.user_id =
addresses.user_id ORDER BY users.user_name ASC, anon_62c6.oid' []


--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to