SQLAlchemy中的SQL Pivot操作

时间:2016-10-07 20:42:34

标签: python oracle sqlalchemy

我正在尝试使用SQLAlchemy对数据库执行SQL数据透视操作,但我无法弄清楚如何解决这个问题。由于尺寸的原因,我不想从数据库中取出这些数据,因此我不认为使用numpy / pandas可以帮助我。我试图传递给RDBMS的SQL(当前查询在Oracle上)是这样的:

SELECT *
FROM (
    SELECT COL_A, COL_B, COL_C, COL_D
    FROM MY_TABLE
) PIVOT (
    MAX(COL_D)
    FOR COL_D IN (
        'VAL_1',
        'VAL_2',
        'VAL_3',
    )
)

我无法在SQLAlchemy中找到任何本机支持,因此我尝试沿着创建编译扩展的路线前进。这就是我目前的方式:

from sqlalchemy.sql.expression import ClauseElement, Executable
from sqlalchemy.ext.compiler import compiles


class Pivot(Executable, ClauseElement):
    def __init__(self, piv_sub_query, func, for_col, in_cols):
        self.piv_sub_query = piv_sub_query
        self.func = func
        self.for_col = for_col
        self.in_cols = in_cols

@compiles(Pivot)
def visit_pivot(element, compiler, **kwargs):
    in_group = ["'" + element.in_cols[key] + "' AS " + key for key in element.in_cols.keys()]
    in_str = ",\n".join(in_group)
    return "SELECT * FROM (\n%s\n) PIVOT (\n%s\nFOR %s IN (\n%s\n)\n)" % (
        element.piv_sub_query,
        element.func,
        element.for_col,
        in_str
    )

piv_sub = select([
    my_table.c.col_a,
    my_table.c.col_b,
    my_table.c.col_c,
    my_table.c.col_d
]).select_from(
    my_table
)
piv = Pivot(piv_sub, "MAX(COL_D)", "COL_D", {"VAL_1": "VAL_1", "VAL_2": "VAL_2", "VAL_3": "VAL_3"})
out = conn.execute(piv)

然而,虽然这将执行,但它并没有我需要的所有属性。在真正的查询中,pivot只是一个子查询,所以我需要能够将它视为一个表(也就是从中选择,抓取/操纵它的列等)。我假设我错过了扩展正确基类或需要覆盖" c"属性,所以我可以访问这些列。非常感谢任何帮助!

0 个答案:

没有答案