Возможно ли в ядре sqlalchemy получить доступ к базовому объекту Select из объекта Alias ​​или CTE? - PullRequest
0 голосов
/ 31 января 2019

Я могу превратить 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.

1 Ответ

0 голосов
/ 31 января 2019

Оказывается, для этой цели есть атрибут original.

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

оба возвращают True.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...