That's the problem, if I have use_labels=True, and I include "as somecolumn" in the text clause, I still get a generated label. The resulting sql = "..... as somecolumn as somelonglabelthatisashortenedversionofthetext". that creates an sql error.
On Feb 27, 3:51 pm, Michael Bayer <[EMAIL PROTECTED]> wrote: > yeah with text just say "as sometable_somecolumn". > > On Feb 27, 2007, at 4:16 PM, Dennis wrote: > > > > > Well, columnname isn't a simple column in the case of a case > > statement... the label is turning out like this: > > > "casewhenhas_testtrueandscoreisnullandgender1then1whenscoreisnullthen2 > > elsescoreend" > > > I haven't found a way to manually assign a label to a text clause yet, > > but before I tried use_labels=True, I has appended "as score" to the > > case clause and that worked. > > > On Feb 27, 2:44 pm, Michael Bayer <[EMAIL PROTECTED]> wrote: > >> the label is always "tablename_columnname". youd have to show me > >> where you need that to be "programmatic". > > >> On Feb 27, 2007, at 2:29 PM, Dennis wrote: > > >>> Thanks for taking a peek. > > >>> Interesting, it does indeed fix the issue to use labels. Now I have > >>> another issue though, I have a case statement in my select which > >>> I was > >>> specifying like this: > > >>> select ( ['case when .... yada yada yada end as something' ] ...... > > >>> If use_labels = True, then the query breaks because the generated > >>> sql > >>> has two as label parts two it. > > >>> if I delete the "as something" part, I think don't know > >>> programatically what the label is though. I need to know that > >>> because > >>> I order by it. > > >>> Isn't there a way to find out a column label from a query? > > >>> -Dennis > > >>> On Feb 27, 12:47 pm, Michael Bayer <[EMAIL PROTECTED]> wrote: > >>>> if you run it with full blown logging on, i.e.: > > >>>> import logging > >>>> logging.basicConfig() > >>>> logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG) > >>>> logging.getLogger('sqlalchemy.orm').setLevel(logging.DEBUG) > > >>>> the issue can be detected when you look at the mapper creating > >>>> instance keys for "T" (although this is clearly not a novice > >>>> issue): > > >>>> DEBUG:sqlalchemy.orm.mapper.Mapper:(T|ts) _instance(): identity key > >>>> (<class '__main__.T'>, (1,), None) not in session[] > >>>> DEBUG:sqlalchemy.orm.mapper.Mapper:(T|ts) _instance(): identity key > >>>> (<class '__main__.T'>, (None,), None) not in session[] > >>>> DEBUG:sqlalchemy.orm.mapper.Mapper:(T|ts) _instance(): identity key > >>>> (<class '__main__.T'>, (3,), None) not in session[] > >>>> DEBUG:sqlalchemy.orm.mapper.Mapper:(T|ts) _instance(): identity key > >>>> (<class '__main__.T'>, (None,), None) not in session[] > >>>> DEBUG:sqlalchemy.orm.mapper.Mapper:(T|ts) _instance(): identity key > >>>> (<class '__main__.T'>, (5,), None) not in session[] > > >>>> so its not getting an identity key for every other row, which > >>>> indicates its looking at the wrong column in the result set. (on > >>>> each of those "None"s, its going to skip that entity) looking at > >>>> the > >>>> query: > > >>>> SELECT ts.id, ts.dat, other.ts_id, other.other_dat > >>>> FROM ts LEFT OUTER JOIN other ON ts.id = other.ts_id > > >>>> we can see that "other" has a column called "ts_id", which looks > >>>> exactly like the label that would be made for "id" in table > >>>> "ts". so > >>>> thats whats happening here. so throwing on a "use_labels=True" to > >>>> the query (or changing the name of "ts_id") produces the query: > > >>>> SELECT ts.id AS ts_id, ts.dat AS ts_dat, other.ts_id AS > >>>> other_ts_id, > >>>> other.other_dat AS other_other_dat > >>>> FROM ts LEFT OUTER JOIN other ON ts.id = other.ts_id > > >>>> that gives the correct results. > > >>>> not sure what SA can really do here to make this kind of issue > >>>> easier > >>>> to catch, since the resultproxy itself is where its looking for > >>>> "col > >>>> label, col name, ", etc. the generated labels are generally more > >>>> accurate. i tried playing around with ResultProxy to make it > >>>> detect > >>>> an ambiguity of this nature, but i think it might not be possible > >>>> unless more flags/switches get passed from the statement to the > >>>> result (which id rather not do since it further marginalizes > >>>> straight > >>>> textual queries), since if the select statement uses table/col > >>>> labels > >>>> for each column, there still could be conflicts which dont matter, > >>>> such as the column names the normal eager loader generates: > > >>>> 'ts_id', 'ts_dat', 'other_4966_ts_id', 'other_4966_other_dat', > > >>>> that result is from column "ts_id" attached to an Alias > >>>> "other_4966". if we said "dont allow any Column to be found > >>>> twice in > >>>> the row", then that breaks (since it will match other_4966_ts_id on > >>>> its _label, ts_id on its name). > > >>>> On Feb 27, 2007, at 12:09 PM, Dennis Muhlestein wrote: > > >>>>> from sqlalchemy import * > > >>>>> e=create_engine('sqlite://memory') > >>>>> ts=Table('ts',e, > >>>>> Column ( 'id',Integer,primary_key=True), > >>>>> Column ( 'dat',Integer,nullable=False)) > >>>>> ts.create() > > >>>>> to_oneornone=Table('other',e, > >>>>> Column ( 'ts_id', Integer,ForeignKey('ts.id'), > >>>>> primary_key=True, > >>>>> nullable=False ), > >>>>> Column ( 'other_dat', Integer, nullable=False ) ) > >>>>> to_oneornone.create() > > >>>>> class T(object): pass > >>>>> T.mapper=mapper(T,ts) > > >>>>> class To(object):pass > >>>>> To.mapper=mapper(To,to_oneornone,properties={'ts':relation > >>>>> (T,backref=backref('other',uselist=False))}) > > >>>>> s=create_session() > >>>>> for x in range(10): > >>>>> t=T() > >>>>> t.dat=x > >>>>> s.save(t) > > >>>>> if x % 2 == 0: # test every other T has an optional data > >>>>> o=To() > >>>>> o.other_dat=x > >>>>> t.other=o > > >>>>> s.save(t) > >>>>> s.flush() > > >>>>> s.clear() > > >>>>> somedata=s.query(T).options(eagerload('other')).select() > >>>>> print 'Number results should be 10: ', len(somedata) > > >>>>> s.clear() > > >>>>> sel=select([ts,to_oneornone], > >>>>> from_obj=[ts.outerjoin(to_oneornone)]) > > >>>>> print "Raw select also is 10: " , len(sel.execute().fetchall() ) > > >>>>> print "Instances should also be 10: ", len(s.query(T).options > >>>>> (contains_eager('other')).instances(sel.execute())) --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---