Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用SQLAlchemy的表达式语言编写条件子句?_Python_Mysql_Sqlalchemy - Fatal编程技术网

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

Python 如何使用SQLAlchemy的表达式语言编写条件子句?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,因此,我编写了一个相当复杂的查询,从两个表中获取并连接一组数据 SELECT /* Common attributes */ carrier.name, carrier.notes, carrier.turnaround, /* Either per-reseller price, generic reseller price or default price */ IFNULL( rsu.price, IF(

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

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查询生成器重写此代码的方法吗?我不确定这些选择是否可能。。。如果条款


编辑:我不想使用ORM来做这件事,据我所知,纯粹使用SQLAlchemy ORM来执行这件事是不可能的。我只是在寻找一种使用SQLAlchemy的核心实现这一点的或多或少可移植的方法。

您可以使用在查询中包含一个条件。这不会产生与您所介绍的SQL完全相同的SQL,但可以产生功能上等价的东西

下面是一个简单的示例,carrier和rsu变量引用表对象,case引用上述函数:

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
        )
    ]
])
您可能会发现制作一些帮助函数来表示更高级别的IFNULL和IF函数以提高查询的可读性非常方便。例如:

def if_(expr, then, else_):
    return case([
        (expr, then)
    ], else_=else_)

发布模型会有帮助。没有模型。你是说DB模式吗?SQLAlchemy最好的特性是它的ORM特性。当我说模型时,我指的是ORM。模式是可以的,但我希望您没有定义原始模式。我的意思是你甚至可以从你的MySQL控制台复制并粘贴模式。无论哪种方式,使用完整的模式都更容易阅读。@SQLAlchemy由两个不同的部分组成-核心层和ORM层。我只使用核心。我认为guy在使用核心时仍然需要声明模型,这只会节省状态管理的所有开销。无论如何,我不确定这是否可以在SqlAlchemy中干净地完成。