在运行时动态生成where语句

时间:2017-01-07 19:54:39

标签: python sql postgresql sqlalchemy

我使用Sqlalchemy自动化SQL查询,分析我们运行的A / B测试。

以下是一个示例查询:

    uniques_by_day = select([
                        first_seen_byos.c.unique_id,
                        func.date_trunc('day', a_unique_users.c.ds).label('current_day'),
                        func.date_trunc('day', first_seen_byos.c.ds).label('cohort_join_day')
                        ]).\
                    select_from(joined_table).\
                    where(
                        and_(
                            a_unique_users.c.os_type == 'iphone_native_app',
                            first_seen_byos.c.ds >= '2017-01-01'
                            )
                        )

在查询之间要改变的是where / and_语句的子句。我如何编写一个能够使用where子句的动态集合的一般声明?我期待这些条款永远是一系列AND条款。

1 个答案:

答案 0 :(得分:1)

当我需要动态构建查询时,我通常会这样做:

query = session.query(MyTable)
if case_1:
    query = query.filter(MyTable.column_1 == 'foo')
if case_2:
    query = query.filter(MyTable.column_2 == 'bar')
query_results = query.all()

这是使用声明性基本语法,但我认为它是有意义的。