Ken*_*eth 5 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',
)
)
Run Code Online (Sandbox Code Playgroud)
我在 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)
Run Code Online (Sandbox Code Playgroud)
然而,虽然这将执行,但它没有我需要的所有属性。在真正的查询中,pivot 只是一个子查询,所以我需要能够将它视为一个表(也就是从中选择、抓取/操作其列等)。我假设我缺少一些东西,比如扩展正确的基类或需要覆盖“c”属性以便我可以访问这些列。任何帮助将不胜感激!