Search code examples
sqlalchemyorm

SQL Alchemy how to use OR_ with AND_


Here is the code:

    if len(test1) > 0 or len(test2) > 0 or len(test3) > 0 or len(test4) > 0:
        filter_conditions = []

        if len(test1) > 0:
            filter_conditions.append(Object.test1.in_(test1))

        if len(test2) > 0:
            filter_conditions.append(Object.test2.in_(test2))

        if len(test3) > 0:
            filter_conditions.append(and_(Object.test3.in_(test3),
                                        Object.istest == 1))

        if len(test4) > 0:
            filter_conditions.append(and_(Object.test4.in_(test4),
                                        Object.istest == 1))

        final_filter_conditions = or_(*filter_conditions)
        count_query = count_query.filter(final_filter_conditions)

this return the result with where clause like this:

WHERE Object."istester" = :istester AND (Object."test1" IN ([test1_1]) OR Object."test2" IN ([POSTCOMPILE_test2_1]) OR (Object."test3" IN ([POSTCOMPILE_test3_2]) AND Object."istest" = :istest_1) OR Object."test4" IN ([POSTCOMPILE_test4]) AND Object."istest" = :istest_2)

I want to achieve like this: need two brackets WHERE Object."istester" = :istester AND (Object."test1" IN ([test1_1]) OR Object."test2" IN ([POSTCOMPILE_test2_1]) OR (Object."test3" IN ([POSTCOMPILE_test3_2]) AND Object."istest" = :istest_1) OR (Object."test4" IN ([POSTCOMPILE_test4]) AND Object."istest" = :istest_2))'

Thanks

WHERE Object."istester" = :istester AND (Object."test1" IN ([test1_1]) OR Object."test2" IN ([POSTCOMPILE_test2_1]) OR (Object."test3" IN ([POSTCOMPILE_test3_2]) AND Object."istest" = :istest_1) OR Object."test4" IN ([POSTCOMPILE_test4]) AND Object."istest" = :istest_2)


Solution

  • use .self_group() at the end of each clause.

    https://docs.sqlalchemy.org/en/20/core/sqlelement.html#sqlalchemy.sql.expression.ClauseList.self_group