Michael,

Is there any chance we might see support for *with_labels* in this use 
case? Even though my "solution" works, it's somewhat of an annoyance with 
all these warnings being spit out:

*SAWarning: Column 'id' on table <sqlalchemy.sql.selectable.Select at 
> 0x110cd5d30; Select object> being replaced by Column('id', Integer(), 
> table=<Select object>, primary_key=True, nullable=False), which has the 
> same key.  Consider use_labels for select() statements.*



On Friday, April 10, 2015 at 12:19:31 AM UTC+2, Michael Bayer wrote:
>
>
>
> On 4/9/15 1:50 PM, Jacob Magnusson wrote:
>
> I have this case with a bundle that looks something like this:
>
> primate_bundle = Bundle(
>     'primate',
>     Primate.name,
>     Bundle('wooden_tool', *[
>         WoodenTool.id,
>         WoodenTool.name,
>         WoodenToolCategory.name.label('category'),
>     ]),
>     Bundle('solid_tool', *[
>         SolidTool.id,
>         SolidTool.name,
>         SolidToolCategory.name.label('category'),
>     ])
> )
>
> Then I query it like this:
>
> session.query(primate_bundle)
> .select_from(Primate)
> .join(WoodenTool, Primate.main_tool)
> .join(WoodenToolCategory, WoodenTool.category_id == WoodenToolCategory.id)
> .join(SolidTool, Primate.secondary_tool)
> .join(SolidToolCategory, SolidTool.category_id == SolidToolCategory.id)
> .all()
>
> However, since the label for category name is the same within both 
> sub-bundles it will throw Ambiguous column name (because the compiled SQL 
> labels will be exactly the same). Adding .with_labels() doesn’t fix it. 
> Full traceback can be seen by running the included examples. Commenting out 
> one of the .label() lines in the example makes it runnable. Do you guys 
> have a clean solution to support this use case? I really like this feature 
> of creating your own custom made results so it would be a shame to not be 
> able to do this.
>
> OK well here's one hacky way, that we could better accommodate by adding a 
> "key" parameter to label(), this is sort of like your other approach:
>
> ay = A.y.label(None)
> ay.key = 'foobar'
> bp = B.p.label(None)
> bp.key = 'foobar'
>
> ab = Bundle(
>     'ab',
>     Bundle('a', *[
>         A.id,
>         A.x,
>         ay,
>     ]),
>     Bundle('b', *[
>         B.id,
>         B.q,
>         bp,
>     ])
> )
>
> The other way is to provide create_row_processor() as we describe here: 
> http://docs.sqlalchemy.org/en/rel_0_9/orm/loading_columns.html?highlight=bundle#column-bundles.
>   
> That way you could just make this work any way you wanted:
>
>
> from sqlalchemy import util
>
>
> class LabelBundle(Bundle):
>     def __init__(self, *arg, **kw):
>         self.extra_labels = kw.pop('extra_labels', {})
>         super(LabelBundle, self).__init__(*arg, **kw)
>
>     def create_row_processor(self, query, procs, labels):
>         # or use a NamedTuple here
>         keyed_tuple = util.lightweight_named_tuple(
>             'result', [self.extra_labels.get(l, l) for l in labels])
>
>         def proc(row):
>             return keyed_tuple([proc(row) for proc in procs])
>         return proc
>
>
> ab = LabelBundle(
>     'ab',
>     LabelBundle(
>         'a',
>         extra_labels={'y': 'foobar'},
>         *[A.id, A.x, A.y]),
>     LabelBundle(
>         'b',
>         extra_labels={'p': 'foobar'},
>         *[B.id, B.q, B.p])
> )
>
>
>
>
>
>
>
> Tested on SQLAlchemy 1.0.0b5 and 0.9.9. Python 3.
>
> Thank you so much for any potential help you can give me on this. I’ve 
> followed the source code for Bundle but I can’t think of a clean way to 
> this…
> ​
> -- 
> 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 [email protected] <javascript:>.
> To post to this group, send email to [email protected] 
> <javascript:>.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>
>
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to