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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 
> wrote:
> 
> On Feb 13, 2014, at 6:21 PM, Tony Garcia <[email protected]> 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 [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/groups/opt_out.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to