On Feb 7, 2014, at 1:00 PM, Matt Phipps <[email protected]> wrote:
>
> I wrote one more test that failed (but I'm pretty sure it doesn't matter): I
> was under the impression that passing Label objects to .columns() would allow
> you to map arbitrary result set column names to ORM attributes, and that
> seems to not be the case (and was never the case, AFAIK). That kind of
> mapping would be cool, and might not even be that hard since the columns in
> the RowProxy ._keymap values seem to have the original ORM columns in their
> .proxy_sets.
yeah I thought this would work but it requires a proxy_set change, which I’d
like to make but has me nervous:
class A(Base):
__tablename__ = 'a'
id = Column(Integer, primary_key=True)
data = Column(String)
result = sess.query(A).from_statement(
text("SELECT id AS x, data AS y FROM a").
columns(A.id.label("x"), A.data.label("y"))
).all()
I’ve added two different patches to
http://www.sqlalchemy.org/trac/ticket/2932#comment:5 which is reopened. both
patches work but i think the second one is more of the right idea.
it works like this too but this renders the subquery, something else to think
about maybe:
A1 = aliased(text("SELECT id AS x, data AS y FROM a").columns(A.id.label("x"),
A.data.label("y")))
result = sess.query(A1).all()
as does this:
stmt = text("SELECT id AS x, data AS y FROM a").columns(A.id.label("x"),
A.data.label("y"))
result = sess.query(A).select_entity_from(stmt).all()
> That said, the only reason I can think of for someone to try that is if they
> did something truly nuts like a join with two columns with the same name from
> two tables which also have the same name, from two different schemas, with a
> stored procedure, into ORM.
well I really hate enforced naming conventions so making this work would be a
breakthrough way of finally getting over that, I like it. I think this can be
done.
also, the change greatly increases performance as the lookup in ResultProxy
doesn’t need a KeyError now. So I really want to try to make it work. I’m
just trying to think of, what are the implications if the text() is then
transformed into an alias() and such, but I think it might be consistent with
how a Table acts right now. I think its cool:
stmt = select([A.id, A.data])
result = sess.query(A).from_statement(stmt).all() # works
stmt = select([A.id, A.data]).alias().select()
result = sess.query(A).from_statement(stmt).all() # you get the same column
error
> I hope I'm not harassing you too much about the TextAsFrom feature! I feel
> like if I asked any other ORM to be this flexible they would either laugh or
> cry. SQLAlchemy is the first ORM I've worked with since using Rails as an
> intern, and I'm spoiled now with how awesome it is :)
its great, this feature is going to be much better and important than how it
started a few months ago. I’ve added a lot of new thoughts to that ticket.
signature.asc
Description: Message signed with OpenPGP using GPGMail
