python - 在 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 的函数。
解决方案
事实证明,有一个属性original
正是为此目的而调用的。
table_cte.original == table_select
table_select.alias().original == table_select
两者都返回 True。
推荐阅读
- python - 使用 pandas 根据特定列中的条件替换日期值
- java - 如何在 Spring 运行时从文本文件中重新加载数据
- react-native - 使用 ReactNative 和 StyledComponents 布局子组件
- java - AWS:Lambda 函数应该用哪种语言编写,以便 lambda 可以访问/调用 .so 文件(linux 中的动态库)
- gmail - 如何将别名电子邮件添加到我的新帐户?
- android - 在片段事务中获取异常作为已调用的提交
- postgresql - SQLSTATE 和 GET STACKED DIAGNOSTICS 信息在另一个函数中?
- vector - 如何将迭代器元素的类型强制转换为新类型?
- javascript - 我需要在通过 multer 上传时添加具有画廊名称的用户的用户 ID
- javascript - GraphQL:仅在本地开发模式下添加 @client 指令