On Jan 21, 2013, at 7:33 AM, Kenny Billiau wrote:

> On Fri Jan 18 15:40:25 2013, Simon King wrote:
>> On 18 Jan 2013, at 12:15, Kenny <bill...@mpimp-golm.mpg.de> wrote:
>> 
>>> Hey all,
>>> 
>>> I'm quite new to SQLAlchemy and I've been struggling to get the following 
>>> to work.
>>> 
>>> When one queries with specific entities, the resulting namedTuples might 
>>> have overlapping keys.
>>> e.g.
>>> 
>>>     sample = session.query(
>>>             Sample.id,
>>>             Experiment.id
>>>         ).\
>>>         join(Experiment).\
>>>         filter(Experiment.active==1).\
>>>         distinct().\
>>>         first()
>>>      print sample.id # will print experiment.id
>>> 
>>> So, how do access conflicting attributes?
>>> I know I can use Sample.id.label('sample_id'), but I would prefer to have 
>>> this in an automatic way. Much in the same way as the function 
>>> with_labels() works on the query object, but then bubbling through to the 
>>> actual result.
>>> Any suggestions would be welcome!
>>> 
>>> wkr,
>>> Kenny
>>> ps: I am using SQLALchemy 0.7.3
>>> 
>> 
>> I think you should be able to do this:
>> 
>>   print sample[Sample.id]
>>   print sample[Experiment.id]
>> 
>> Hope that helps,
>> 
>> Simon
> 
> Nope, that didn't do the trick. Anyone else have any suggestions?
> 
> Or is there any way to automatically add a label to all attributes in the 
> same way as .label() does now?

Well, the two columns have the same name "id", you have the option to give them 
a new name with label(), and the "tablename_colname" scheme you refer to is 
really more oriented towards getting the SQL statements to be legal for the 
database and the columns targetable by name as far as SQLAlchemy internals are 
concerned.   It doesn't scale well for explicit user access since as soon as 
you start using aliases, those are typically anonymously named.    The Query is 
trying to stay away from cases like that and if it were me, I'd just be 
iterating the two values explicitly, i.e. "sample_id, experiment_id = 
session.query(...)".

But, here's a recipe that will give you "Sample_id", "Experiment_id", and it 
uses all public APIs too:

from sqlalchemy.orm.query import Query

class QueryWithLabels(Query):
    def with_entity_labels(self):
        modified = []
        for expr in self.column_descriptions:
            if hasattr(expr['expr'], "property"):
                cls = expr['expr'].class_
                modified.append(expr['expr'].\
                        label('%s_%s' % (cls.__name__, expr['name'])))
            else:
                modified.append(expr['expr'])
        return self.with_entities(*modified)


from sqlalchemy import Column, Integer, create_engine, ForeignKey
from sqlalchemy.orm import Session, relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class A(Base):
    __tablename__ = "a"

    id = Column(Integer, primary_key=True)
    bs = relationship("B")


class B(Base):
    __tablename__ = "b"

    id = Column(Integer, primary_key=True)

    a_id = Column(Integer, ForeignKey('a.id'))

e = create_engine("sqlite://", echo=True)

Base.metadata.create_all(e)

s = Session(e, query_cls=QueryWithLabels)

s.add_all([
        A(bs=[B(), B()]),
        A(bs=[B(), B()])
    ])
s.commit()

results = s.query(A.id, B.id).with_entity_labels().all()

for result in results:
    print result.A_id, result.B_id








> 
> wkr,
> Kenny
> 
> -- 
> 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 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to