Hi,

another day and another challenge :).

Somehow SQLAlchemy has a problem determining what to join when using
concatenation of columns.

this: session.query(Locality.name, Street.name).join(Street.locality)
properly joins:
FROM street JOIN locality ON street."localityId" = locality."Id" 

but this: session.query(Locality.name + ' ' +
Street.name).join(Street.locality)

does: FROM street, locality JOIN locality ON street."localityId" =
locality."Id"

The second one can be fixed with joining on the backref of
Stret.locality,
but maybe SQLAlchemy could work it out on its own?

This is the code (copy at http://ideone.com/wWvT5 ):
================================================
# Fails with Python-2.7.0 and SQLAlchemy-0.7.1

import sqlalchemy
import sqlalchemy.ext.declarative
import pprint

Base = sqlalchemy.ext.declarative.declarative_base(mapper =
sqlalchemy.orm.mapper)


engine = sqlalchemy.create_engine('sqlite:///:memory:', echo = True)

session = sqlalchemy.orm.scoped_session(
    sqlalchemy.orm.sessionmaker(
        bind = engine,
        autocommit = False,
    )
)

Base.metadata.bind = engine


class Locality(Base):
    Id = sqlalchemy.Column( sqlalchemy.types.Integer, primary_key =
True, autoincrement = True)
    __tablename__ = 'locality'
    name = sqlalchemy.Column( sqlalchemy.types.String(128), nullable =
False)

class Street(Base):
    Id = sqlalchemy.Column(sqlalchemy.types.Integer, primary_key = True)
    __tablename__ = 'street'
    name = sqlalchemy.Column( sqlalchemy.types.String(128), nullable =
False)
    localityId = sqlalchemy.Column(sqlalchemy.types.Integer,
sqlalchemy.ForeignKey(Locality.Id))
    locality = sqlalchemy.orm.relation(Locality, primaryjoin =
localityId == Locality.Id)
    
Base.metadata.create_all()

sp = Locality(name = 'Southpark')
sv = Locality(name = 'Smallville')

session.add(sp)
session.add(sv)

session.add(Street(name = 'sp1', locality = sp))
session.add(Street(name = 'sp2', locality = sp))

session.add(Street(name = 'sv1', locality = sv))
session.add(Street(name = 'sv2', locality = sv))

#q = session.query(Street.name + ' ' + Locality.name)
# the above works

#q = session.query(Locality.name, Street.name)
# the above works

q = session.query(Locality.name + ' ' + Street.name)
# the above causes:
# sqlite: sqlalchemy.exc.OperationalError: (OperationalError) ambiguous
column name: locality.name u'SELECT locality.name || ? || street.name AS
anon_1 \nFROM street, locality JOIN locality ON street."localityId" =
locality."Id" \nWHERE locality.name = ?' (', ', 'Southpark')
# postgresql: sqlalchemy.exc.ProgrammingError: (ProgrammingError) table
name "locality" specified more than once 'SELECT locality.name ||
%(name_1)s || street.name AS anon_1 \nFROM street, locality JOIN
locality ON street."localityId" = locality."Id" \nWHERE locality.name =
%(name_2)s' {'name_2': 'Southpark', 'name_1': ' '}


q = q.join(
    Street.locality
).filter(
    Locality.name == 'Southpark'
)

pprint.pprint(
    q.all(),
    indent = 2
)
================================================

regards,
Filip Zyzniewski
Tefnet

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