如何使用SQLAlchemy的表达式语言编写条件子句?

2024-05-19 20:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我编写了一个相当复杂的查询,从两个表中获取并连接一组数据。在

SELECT
    /* Common attributes */
    carrier.name,
    carrier.notes,
    carrier.turnaround,

    /* Either per-reseller price, generic reseller price or default price */
    IFNULL(
        rsu.price,
        IF(
            (
                carrier.reseller_price != IS NOT NULL AND
                carrier.reseller_price != 0
            ),
            carrier.reseller_price,
            carrier.price
        )
    ) AS price,
    IFNULL(
        rsu.price_barred,
        IF(
            (
                carrier.reseller_price_barred IS NOT NULL AND
                carrier.reseller_price_barred != 0
            ),
            carrier.reseller_price_barred,
            carrier.price_barred
        )
    ) AS price_barred
FROM
    `core_carrier` AS carrier
LEFT OUTER JOIN
    `core_resellerunlock` AS rsu ON (
        rsu.carrier_id = carrier.id AND
        rsu.reseller_id = 1
    )

有人能建议一种使用SQLAlchemy查询生成器重写它的方法吗?我不确定这些SELECT ... IF子句是否可行。在

编辑:我不想使用ORM来实现这一点(据我所知,纯粹使用SQLAlchemy ORM来执行是不可能的)。我只是在寻找一种使用SQLAlchemy的核心来实现这一点的一种或多或少的便携方式。在


Tags: andidifsqlalchemyisasnotselect
1条回答
网友
1楼 · 发布于 2024-05-19 20:27:36

可以使用the ^{} function在查询中包含条件。这不会产生您所提供的SQL,但可以产生功能上等效的东西。在

前面提到的{cd2}和

join = carrier.join(rsu, (rsu.c.carrier_id == carrier.c.id) & (rsu.c.reseller_id == 1))
query = join.select([
    carrier.c.name,
    carrier.c.notes,
    carrier.c.turnaround,
    case([
        (
            rsu.c.price_barred == None,
            case([
                (
                    (carrier.c.reseller_price != None) & (carrier.c.reseller_price != 0),
                    carrier.c.reseller_price
                )
            ],
            else_=carrier.c.price
        )
    ]
])

您可能会发现创建一些helper函数来表示更高级别的IFNULL和{}函数,以提高查询的可读性。例如:

^{pr2}$

相关问题 更多 >