首页 > 解决方案 > 在 sqlalchemy 核心中是否可以从 Alias 或 CTE 对象访问底层 Select 对象?

问题描述

我可以使用 将 CTE 或 Alias 转换为 Select .select(),但诸如此类的语句table.select().alias().select().cte().select().alias().select()会导致不必要的冗长编译 SQL。有没有更好的方法来反转/撤消.alias()和/或.cte()操作?

我正在使用 sqlalchemy 核心构建依赖于共享子查询的查询,并希望轻松地将子查询作为 CTE(用于加入并将其用作子查询)和 Select 语句(用于直接执行)访问。我希望在不必同时跟踪原始子查询和query.cte()并行输出的情况下实现这一点。

# preliminary setup
import pandas
from sqlalchemy import MetaData, create_engine, Table
engine = create_engine('sqlite:///')
pandas.DataFrame(data={'A': [1,2,3]}).to_sql('table1', engine, index=False)
table = Table('table1', MetaData(bind=engine), autoload=True)
# end of preliminary setup

table_select = table.select()
table_cte = table_select.cte()

print table_cte.select()  # works but lengthier than necessary
print table_select  # desired output

简而言之,我想要一个以 table_cte 作为输入并输出 table_select 的函数。

标签: pythonsqlalchemy

解决方案


事实证明,有一个属性original正是为此目的而调用的。

table_cte.original == table_select
table_select.alias().original == table_select

两者都返回 True。


推荐阅读