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.
signature.asc
Description: Message signed with OpenPGP using GPGMail
