2014-10-09 13 views
6

Jestem w trakcie przekształcania kodu Pythona na nowe Pandy oparte na SQLAlchemy 0.14.1.W jaki sposób pandas.read_sql_query() może wysłać zapytanie do tabeli TEMP?

Wspólny wzór używamy jest (ogólnie):

connection = db.connect() # open connection/session 

sql = 'CREATE TEMP TABLE table1 AS SELECT ...' 
connection.execute(sql) 

... other sql that creates TEMP tables from various joins of previous TEMP tables ... 

sql = 'CREATE TEMP TABLE tableN AS SELECT ...' 
connection.execute(sql) 

result = connection.query('SELECT * FROM tableN WHERE ...') 

connection.close() 

Teraz, gdy połączenie jest zamykane tabel TEMP są usuwane przez serwer DB. Jednak ponieważ ostateczne zapytanie wyboru korzysta z tego samego połączenia/sesji, może uzyskać dostęp do tabel.

Jak mogę osiągnąć podobne przy użyciu SQLAlchemy i pd.read_sql_query()?

Na przykład:

engine = sqlalchemy.create_engine('netezza://@mydsn') 
connection = engine.connect() 

sql = 'CREATE TEMP TABLE tmptable AS SELECT ...' 
connection.execute(sql) 

result = pd.read_sql_query('SELECT * FROM tmptable WHERE ...', engine) 

daje błąd DB że tmptable tabeli TEMP nie istnieje. Prawdopodobnie dzieje się tak dlatego, że przekazanie silnika do read_sql_query() wymaga otwarcia nowego połączenia, które ma niezależny zakres sesji i dlatego nie może zobaczyć tabeli TEMP. Czy to rozsądne założenie?

Czy istnieje sposób obejścia tego? (przekazywanie połączenia do read_sql_query() nie jest obsługiwane)

(Wiem, że mogę połączyć SQL w jeden ciąg z rozdzielaniem instrukcji, ale jest to uproszczenie rzeczywistej sytuacji, w której tabele TEMP są stworzone przez wiele funkcji, które wymagają zagnieżdżenia innych użytkowników w głąb 3-4, więc aby to osiągnąć, potrzebna jest implementacja warstwy, która może doprowadzić do połączenia SQL w wielu połączeniach przed ich wydaniem, co wolałbym uniknąć, jeśli istnieje lepszy sposób)

Używanie -
Pandy: 0.14.1
sqlalchemy: 0.9.7
pyodbc: 3.0.6
Win7 x86_64 dystrybucja Zadaszenie Pythona (Python 2.7.6)
Josh Kuhna Netezza SQLAlchemy dialekt z https://github.com/deontologician/netezza_sqlalchemy

+0

Czy możesz otworzyć problem z Github jako żądanie ulepszenia? Zobacz https://github.com/pydata/pandas/issues – joris

+0

Zobacz dalej https://github.com/pydata/pandas/issues/8533 – joris

Odpowiedz

0

używasz Python i Netezza używałem R i SQL Server, więc to może być inna. W moim skrypcie wpadłem na podobny problem. sp_execute_external_script w języku T-SQL, który pozwala na uruchamianie kodu zewnętrznego w bazie danych tylko dla instrukcji select. Było to dla mnie uciążliwe, ponieważ chciałem uruchomić procedurę składowaną, aby utworzyć tabelę tymczasową do wyboru. Alternatywnie, mógłbym używać typowych wyrażeń tabelowych, związków itp. Warto byłoby przeprowadzić dalsze badania.

Powiązane problemy