here is a demo:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Appl(Base):
    __tablename__ = 'appl'
    id = Column(Integer, primary_key=True)
    refid = Column(Integer)
    lastname = Column(Unicode(50))
    firstname = Column(Unicode(50))
    cityid = Column(Integer, ForeignKey('city.id'))
    city = relationship('City')

class City(Base):
    __tablename__ = 'city'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(30), nullable=False)

e = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
Base.metadata.drop_all(e)
Base.metadata.create_all(e)

DBSession = Session(e)

c1, c2, c3 = City(name='c1'), City(name='c2'), City(name='c3')
DBSession.add_all([
    Appl(firstname='b', lastname='a', refid=1, city=c1),
    Appl(firstname='b', lastname='a', refid=1, city=c2),
    Appl(firstname='b', lastname='a', refid=2, city=c3),
    Appl(firstname='q', lastname='z', refid=2, city=c1),
    Appl(firstname='b', lastname='a', refid=3, city=c2),
])

qlast, qfirst = 'a', 'b'
d = DBSession.query(Appl).\
   distinct(Appl.refid).\
   filter(Appl.lastname == qlast).\
   filter(Appl.firstname == qfirst).\
   group_by(Appl).\
   order_by(Appl.refid)
d = d.cte('distinct_query')

q = DBSession.query(Appl).select_entity_from(d).\
    join(Appl.city).\
    order_by(d.c.lastname, d.c.firstname)

for row in q:
    print row.refid, row.firstname, row.lastname, row.city.name





On Sep 24, 2013, at 5:58 PM, Nathan Mailg <nathanma...@gmail.com> wrote:

> On Sep 20, 2013, at 11:59 AM, Michael Bayer <mike...@zzzcomputing.com> wrote:
> 
>> 
>> Ok now I'm still not following - in this case, "row" is a NamedTuple, or a 
>> mapped instance?   if its a NamedTuple then you don't have the service of 
>> traversing along object relationships available since the NamedTuple isn't a 
>> mapped object.  You'd need to query for a full object with an identity ( 
>> query(MyClass) as opposed to query(MyClass.col1, MyClass.col2, ...)
>> 
>> if you provide me with *very minimal, but working* mappings and the query 
>> we're working on, I can show you how to make it load entities rather than 
>> rows.
>> 
> 
> 
> In the debugger the returned row was of type "KeyedTuple", which I think is 
> derived from "NamedTuple", so yes, it's a NamedTuple and not a mapped 
> instance.
> 
> I really appreciate your help with this. Below is as stripped down as I can 
> make it while still showing the moving parts:
> 
> class Appl(Base):
>    __tablename__ = 'appl'
>    id          = Column(Integer, primary_key=True)
>    refid       = Column(Integer, Sequence('appl_refid_seq'))
>    appldate    = Column(Date)
>    lastname    = Column(Unicode(50))
>    firstname   = Column(Unicode(50))
>    cityid      = Column(Integer, ForeignKey('city.id'))
>    cityid2     = Column(Integer, ForeignKey('city.id'))
>    #
>    city         = relationship('City', lazy='joined', 
> primaryjoin='City.id==Appl.cityid')
>    city2        = relationship('City', lazy='joined', 
> primaryjoin='City.id==Appl.cityid2')
> 
> class City(Base):
>    __tablename__ = 'city'
>    id      = Column(Integer, primary_key=True)
>    name    = Column(Unicode(30), nullable=False)
>    state   = Column(Unicode(2), nullable=False)
>    zipcode = Column(Unicode(10))
> 
> qlast, qfirst = params['query'].split(' ', 1)
> d = DBSession.query(Appl).\
>    distinct(Appl.refid).\
>    filter(Appl.lastname.ilike(qlast)).\
>    filter(Appl.firstname.ilike(qfirst+'%')).\
>    group_by(Appl).\
>    order_by(Appl.refid, Appl.appldate.desc())
> d = d.cte('distinct_query')
> q = DBSession.query(d).\
>    join(City, City.id==d.c.cityid).\
>    order_by(d.c.lastname, d.c.firstname)
> 
> What I'm trying to get at are the attrs on City after running "q", like:
> 
> # row is KeyedTuple instance
> for row in q.all():
>    # this works
>    print row.lastname
>    # below does not work,
>    # stuck here trying to get at joined City attrs, e.g. City has a "name" 
> attr
>    print row.city.name
> 
> Thank you!
> 
> -- 
> 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 sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to