The following used to work in SQLAlchemy 0.3:

from sqlalchemy import *
from sqlalchemy.orm import *

metadata = MetaData("...")
metadata.bind.echo=True

table = Table("test", metadata,
              Column("id", Integer, primary_key=True),
              Column("active", Boolean))

table.create()

table.insert().execute([{"active": False}, {"active": True}])

test = table.select(table.c.active).alias("test")

class Test(object):
    pass

mapper(Test, test)

session = create_session()

print session.query(Test).all()


The SQL statement looks fine:

SELECT test.id AS test_id, test.active AS test_active
FROM (SELECT test.id AS id, test.active AS active
FROM test
WHERE test.active) AS test ORDER BY test.id
{}


But it fails with the following traceback:

Traceback (most recent call last):
  File "wrong_select_new.py", line 24, in ?
    t = session.query(Test).all()
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/query.py", line 571,
in all
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/query.py", line 619,
in __iter__
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/query.py", line 624,
in _execute_and_instances
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/query.py", line 680,
in instances
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line
1373, in _instance
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line
873, in identity_key_from_row
  File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line
1580, in __getitem__
  File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line
1384, in _get_col
  File "build/bdist.linux-i686/egg/sqlalchemy/util.py", line 84, in
__getitem__
  File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line
1294, in lookup_key
sqlalchemy.exceptions.NoSuchColumnError: "Could not locate column in
row for column 'test.id'"


The only thing that I could find out about the reason is that in
engine/base.py (1290)
   context.column_labels
contains the wrong entries. It should contain something like
   {..., '<table>_<column>': '<table>_<column>', ...}.
In the case above, however, it contains
   {..., '<table>_<column>': '<column>', '<column>': '<column>', ...}.
(That is, it contains two items for each column, but the values are
'<column>' instead of '<table>_<column>'.)

After that, I got lost. These values are generated by the postgres
driver. But I could not find where it takes its input from the Alias
object to generate something different than for the Table object.


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