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.