简体   繁体   English

python peewee动态或+和子句

[英]python peewee dynamically or + and clauses

I'd like to do a and clause with two lists of multiple or clauses from the same table .我想做一个and子句,其中包含来自同一个 table 的两个多个or子句列表

The problem with the following code is, that the query result is empty.以下代码的问题是,查询结果为空。 If I just select 'indices' or 'brokers', the result is fine.如果我只选择“指数”或“经纪人”,结果很好。

        ...
        query = query.join(StockGroupTicker, on=(Ticker.id == StockGroupTicker.ticker))
        # indices
        if "indices" in filter:
            where_indices = []
            for f in filter["indices"]:
                where_indices.append(StockGroupTicker.stock_index == int(f))
            if len(where_indices):
                query = query.where(peewee.reduce(peewee.operator.or_, where_indices))

        # broker
        if "brokers" in filter:
            where_broker = []
            for f in filter["brokers"]:
                where_broker.append(StockGroupTicker.stock_index == int(f))
            if len(where_broker):
                query = query.where(peewee.reduce(peewee.operator.or_, where_broker))

    return query.distinct()

SQL Querie (update) SQL查询(更新)


# index and brocker

SELECT
    DISTINCT `t1`.`id`,
    `t1`.`symbol`,
    `t1`.`type`,
    `t1`.`name`,
    `t1`.`sector`,
    `t1`.`region`,
    `t1`.`primary_exchange`,
    `t1`.`currency`,
    `t1`.`score`,
    `t1`.`last_price`,
    `t1`.`last_price_date`,
    `t1`.`last_price_check`,
    `t1`.`last_stock_split`,
    `t1`.`next_earning`,
    `t1`.`last_earnings_update`,
    `t1`.`disused`,
    `t1`.`source`,
    `t1`.`source_intraday`,
    `t1`.`created`,
    `t1`.`modified`,
    `t2`.`invest_score` AS `invest_score`
FROM
    `ticker` AS `t1`
INNER JOIN `tickerstats` AS `t2` ON
    (`t1`.`id` = `t2`.`ticker_id`)
INNER JOIN `stockgroupticker` AS `t3` ON
    (`t1`.`id` = `t3`.`ticker_id`)
WHERE
    (((((`t1`.`disused` IS NULL)
        OR (`t1`.`disused` = 0))
        AND (`t2`.`volume_mean_5` > 10000.0))
        AND (`t3`.`stock_index_id` = 1))
        AND (`t3`.`stock_index_id` = 10)
        )
        

在此处输入图片说明

Thanks to @coleifer, the peewee solution is quite simple.感谢@coleifer,peewee 解决方案非常简单。 I had to use an alias .我不得不使用alias

if "indices" in filter and filter["indices"]:
    query = query.join(
        StockGroupTicker, peewee.JOIN.INNER, on=(Ticker.id == StockGroupTicker.ticker)
    )
    where_indices = []
    for f in filter["indices"]:
        where_indices.append(StockGroupTicker.stock_index == int(f))
    if len(where_indices):
        query = query.where(peewee.reduce(peewee.operator.or_, where_indices))

if "brokers" in filter and filter["brokers"]:
    BrokerGroupTicker = StockGroupTicker.alias()
    query = query.join(
        BrokerGroupTicker, peewee.JOIN.INNER, on=(Ticker.id == BrokerGroupTicker.ticker)
    )
    where_broker = []
    for f in filter["brokers"]:
        where_broker.append(BrokerGroupTicker.stock_index == int(f))
    if len(where_broker):
        query = query.where(peewee.reduce(peewee.operator.or_, where_broker))

return query.distinct()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM