I don't know if this is what you're thinking, but you can also just build a
query object in different ways if you want to

query = session.query(Study).options(
                                     joinedload(Study.system),
                                     joinedload(Study.site)).
                                     filter(System.system_id=41)
if order_by_study_id:
    if descending:
        query = query.order_by(Study.study_id.desc())
    else:
        query = query.order_by(Study.study_id)
... # whatever other branches etc.

final_results = query.all()




On Thu, Feb 13, 2014 at 8:49 PM, Michael Bayer <mike...@zzzcomputing.com>wrote:

> everything in python is ultimately in a namespace, the names are strings,
> the values are the objects.
>
> like if you had “myapp.model” as a module, and in that module were Study
> and Site, you could say:
>
> from myapp import model
> Study = getattr(model, “Study”)
>
> same thing.
>
> If you want to poke into the registry of class names in declarative, you
> can look inside of Base._decl_class_registry:
>
> def query(clsname, colname):
>     cls = Base._decl_class_registry[clsname]
>     col = getattr(cls, colname)
>
>    q = query(cls).filtert(cls.foo == ‘bar’).order_by(col)
>
>
> this kind of thing is very easy in Python once you get the central idea
> that everything in Python is the same kind of object each with a name.
>
>
>
> On Feb 13, 2014, at 7:56 PM, Tony Garcia <tnyr...@gmail.com> wrote:
>
> Actually, now I see that your suggestion would get me the column object
> (not a string), but it would still restrict me to the study table.
>
>
> On Thu, Feb 13, 2014 at 7:53 PM, Tony Garcia <tnyr...@gmail.com> wrote:
>
>> Oops -- disregard the [start:end] at the end of the query and replace
>> that with .all()
>>
>>
>> On Thu, Feb 13, 2014 at 7:50 PM, Tony Garcia <tnyr...@gmail.com> wrote:
>>
>>> Hmm.. I see what you're saying, but the column can be from any of the
>>> tables queried from, not just the Study table. So it could be
>>> Study.study_id, System.system_name, Site.site_id, etc. Also won't that
>>> getattr() call just return a string? I was under the impression that you
>>> had to pass a column object to order_by(). So if implemented the solution
>>> for dynamic sort direction given in the stackoverflow link above (which
>>> takes advantage of the fact that you can access the .asc() or .desc() 
>>> methods
>>> as attributes on the column object), I have this:
>>>
>>> def my_query(sort_direction='asc'):
>>>      column_sorted = getattr(Study.study_id, sort_direction)()
>>>
>>>      query = Study.query.options(
>>>                         db.joinedload(Study.system),
>>>                         db.joinedload(Study.site)).\
>>>                         filter(System.system_id==41).\
>>>                         order_by(column_sorted)[start:end]
>>>      return query
>>>
>>> How can I modify this so that it doesn't just sort on Study.study_id and
>>> my method signature would be my_query(sort_column, sort_direction)?
>>> Maybe this isn't possible using the ORM and I have to dip down into the
>>> SQL expression language, but I thought I'd ask.
>>>
>>> Thanks.
>>>
>>>
>>> On Thu, Feb 13, 2014 at 7:08 PM, Michael Bayer <mike...@zzzcomputing.com
>>> > wrote:
>>>
>>>>
>>>> On Feb 13, 2014, at 6:21 PM, Tony Garcia <tnyr...@gmail.com> wrote:
>>>>
>>>> > Hello,
>>>> > I'm new to SQLAlchemy and have searched high and low for a solution
>>>> to my problem so I'm hoping someone here can help. I have a query where I
>>>> need to apply the 'order by' clause dynamically (both the column and the
>>>> direction). So a 'static' version of my query would be:
>>>> >
>>>> > studies = session.query(Study).options(
>>>> >                                      joinedload(Study.system),
>>>> >                                      joinedload(Study.site)).
>>>> >                                      filter(System.system_id=41).
>>>> >                                      order_by(Study.study_id.desc()).
>>>> >                                      all()
>>>> >
>>>> > However the order can be asc or desc and it could be any column from
>>>> the 3 tables. I found this post on Stackoverflow which helps with a dynamic
>>>> sort direction (asc, desc), but it doesn't help me with the dynamic column:
>>>> >
>>>> >
>>>> http://stackoverflow.com/questions/20904226/python-sqlalchemy-dynamic-order-by
>>>>
>>>> “dynamic” attribute access in Python is using the getattr() builtin
>>>> function:
>>>>
>>>> def my_query(order_by_column):
>>>>
>>>>    query =
>>>> session.query(Study).filter(Study.system_id=41).order_by(getattr(Study,
>>>> order_by_column))
>>>>
>>>> that seems like what you’re asking, hope it helps.
>>>>
>>>>
>>>>
>>>
>>
>
> --
> 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.
>
>
>

-- 
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.

Reply via email to