Thanks for the quick reply Michael. I would love to hear what you can find
out about it.
I have what I think is a pretty horrible and dirty “solution”. But it
*seems* to work. What I’ve done is to assign the key attribute of columns
like this:
from collections import namedtuple
MyBundleAttr = namedtuple('MyBundleAttr', ['attr', 'key'])
class MyBundle(Bundle):
def __init__(self, name, *exprs, **kw):
new_exprs = []
for expr in exprs:
# Support custom Bundle attr keys. I don't know the side-effects...
if isinstance(expr, MyBundleAttr):
new_expr = expr.attr
new_expr.key = expr.key
else:
new_expr = expr
new_exprs.append(new_expr)
super().__init__(name, *new_exprs, **kw)
And then I use the newly created MyBundleAttr like this:
primate_bundle = MyBundle(
'primate',
Primate.name,
MyBundle('wooden_tool', *[
WoodenTool.id,
WoodenTool.name,
MyBundleAttr(WoodenToolCategory.name, 'category'),
]),
MyBundle('solid_tool', *[
SolidTool.id,
SolidTool.name,
MyBundleAttr(SolidToolCategory.name, 'category'),
]),
single_entity=True,
)
I'm guessing this could cause all kinds of side-effects... Right?
On Thursday, April 9, 2015 at 8:29:15 PM 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.
>
> Yeah, OK I see why that is, I'll try to take a look at this later today.
> The Bundle thing is obviously new and you're the first person I'm seeing
> actually use it. You might need to work around for now :/
>
>
>
>
>
> 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.