在sqlalchemy核心中是否可以从Alias或CTE对象访问基础的Select对象?

时间:2019-01-31 12:08:35

标签: python sqlalchemy

我可以使用.select()将CTE或Alias转换为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的函数。

1 个答案:

答案 0 :(得分:0)

结果正是有一个名为original的属性。

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

都返回True。