On Mon, Jan 12, 2015 at 10:45 AM, Mehdi <[email protected]> wrote:
> Hi
> I want to make a query with given filters received from client side. client
> side sends a json array like this:
> [
>     "0DA": {conditionType: null, column: "serialNumber", operator:
> "GREATER_THAN", value: 50},
>     "1DG": {conditionType: "AND", column: "name", operator: "EQUAL", value:
> "john" }
> ]
>
> I've managed to convert the json array into string query with a template
> like this:
> " {condition_type} {column} {operator} {value} "
>
> But this is only the "WHERE" clause. for complete query i use
> session.query(myModel) which myModel has two relationships with
> lazy="joined" mix with text() for filters:
> session.query(myModel).filter(text(sql_string))
>
> But the problem is the session.query() uses alias column names(with "AS"
> keyword) which my filter part with exact column names couln'd find those
> aliased columns.
> So Is there a way to tell session.query() use the exact column names? or i
> should change my way?
> Thanks.

Rather than using the column names, could you use attributes on
myModel instead? For example:

    col = getattr(myModel, columnname)
    if operator = "GREATER_THAN":
        condition = col > value
    elif operator = "LESS_THAN":
        condition = col < value
    # etc.

    result = session.query(myModel).filter(condition)

You may not even need the "if" statement:

    operators = {
        "GREATER_THAN": sqlalchemy.sql.operators.gt,
        "LESS_THAN": sqlalchemy.sql.operators.lt,
        # etc.
    }

    col = getattr(myModel, columnname)
    condition = operators[operator](col, value)

Hope that helps,

Simon

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

Reply via email to