Sounds great; I agree avoiding the naming convention is ideal. For my project the only reason we're using a text clause is to call a stored procedure, which definitely can't go in a subquery, so I'm not sure how well I can weigh in on the aliasing stuff.
-Matt On Fri, Feb 7, 2014 at 1:43 PM, Michael Bayer <mike...@zzzcomputing.com>wrote: > > On Feb 7, 2014, at 1:00 PM, Matt Phipps <matt.the.m...@gmail.com> 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. > > > -- 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.