On Thu, Nov 15, 2018 at 12:27 AM Martijn van Oosterhout
<klep...@gmail.com> wrote:
>
> Hoi Mike,
>
> On Wednesday, November 14, 2018 at 11:30:18 PM UTC+1, Mike Bayer wrote:
>>
>> I have some big ideas for the baked concept which may or may not
>> impact this area as well.   But they are only ideas for now, I have
>> many explicit SQLAlchemy tasks that I have to get done before I can
>> try to explore that stuff.
>>
>
> Interesting, do you have anything written down?
>
> The baked query concept is a nice starting point but has some shortcomings, 
> in particular with respect to parameters. So we created a WrappedBakedQuery 
> to deal with this. To give an idea how this works:
>
> class FooQuery(WrappedBakedQuery):
>     def initial_query(self, session):
>         return session.query(Foo)
>
>     def filter_by_id(self, id_):
>         self += lambda q: q.filter(Foo.id==bindparam('foo_id'))
>         self |= {'foo_id': id_}
>         # Details omitted, we actually return a copy here
>         return self
>
>     def filter_by_name(self, name):
>         self += lambda q: q.filter(Foo.name==bindparam('foo_name'))
>         self |= {'foo_name': name}
>         return self
>
>
> This allows us to write code like:
>
> query = FooQuery(session)
>
> if params['id'] is not None:
>     query = query.filter_by_id(params['id'])
>
> if params['name'] is not None:
>     query = query.filter_by_name(params['name'])
>
> query = query.join_to_bar()
>
> result = query.all()
>
> And have all the query compilation cached. All the query stuff can be put 
> near the model so your code isn't covered with fragments of SQLAlchemy. I 
> have no idea if this pattern is common, but it works well for us.

filter_by_id and filter_by_name seem to be just occurrences of
"filter_by" with a single hardcoded keyword.   I'm not sure what the
bindparam() part is doing either because a Core binary expression "col
= 'name'" already genertes the bindparam for you.    This helper does
not seem to be specific to "baked" query, as far as the calling API at
least ?

>
> The naming of the bind parameters is a bit clunky though, haven't thought of 
> a good way around that. And you end up with lots of steps which may be a 
> performance issue (which motivated by original question) but we're going to 
> measure that before claiming it's an actual problem. The Bakery can cache 
> actual Query objects, that's what spoil() does, so it seems like a small step.

bindparam() has an anonymous naming feature that is usually what's
used, SQLAlchemy Core does this all for you when you pass a literal
value in.

>
> And exception handling is a bit annoying, with all errors appearing at the 
> point the query is executed, rather than where the fragment is added. OTOH, 
> it doesn't seem smart to try and to magic with tracebacks for something that 
> shouldn't really happen in production code.

that's going to be more specific to the "baked" part and that issue is
unfortunately not avoidable, if we're trying to defer the execution of
all those methods into a single pre-cache step.

>
> I'm not sure what the state of the art is w.r.t. baked queries, but I hope 
> this gives an idea of how we use it.
>
> Have a nice day,
> Martijn
>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> description.
> ---
> 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 https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to