2014-10-09 2 views
6

파이썬 코드를 새로운 SQLAlchemy 기반 Pandas 0.14.1로 변환하는 중입니다.어떻게 pandas.read_sql_query()가 TEMP 테이블을 쿼리 할 수 ​​있습니까?

는 우리가 사용하는 일반적인 패턴은 (일반적으로)입니다 : 이제

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() 

, 연결이 DB 서버에 의해 제거됩니다 임시 테이블을 닫으면. 그러나 최종 선택 쿼리는 동일한 연결/세션을 사용하므로 테이블에 액세스 할 수 있습니다.

어떻게 SQLAlchemy와 pd.read_sql_query()를 사용하여 비슷한 결과를 얻을 수 있습니까? 예를 들어

:

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) 

는 TEMP 테이블 tmptable이 존재하지 않는다는 DB 오류를 얻을 수 있습니다. 아마도 이것은 엔진을 read_sql_query()에 전달하기 위해 독립적 인 세션 범위가있는 새로운 연결을 열어야하므로 TEMP 테이블을 볼 수 없기 때문일 수 있습니다. 그것은 합리적인 가정입니까?

해결 방법이 있습니까? (read_sql_query()에 대한 연결 전달은 지원되지 않습니다)

(저는 SQL을 하나의 문자열로 연결하여 명령문을 분리 할 수 ​​있지만 실제로는 TEMP 테이블이있는 실제 상황을 단순화 한 것입니다. 3 ~ 4 개의 중첩 된 다른 함수를 호출하는 많은 함수에 의해 생성됩니다. 따라서 구현하기 위해서는 여러 호출에서 SQL을 병합 할 수있는 것보다 계층을 구현해야합니다. 더 좋은 방법이 있으면 구현하지 않을 것입니다.)

사용 -
팬더 : 0.14.1
SQLAlchemy의 : 0.9.7
pyodbc : 3.0.6
을Win7에의 x86_64의 캐노피 파이썬 분포 (파이썬 2.7.6) 당신은 파이썬과 네티을 사용하는 https://github.com/deontologician/netezza_sqlalchemy

+0

향상 요청으로 github 문제를 열 ​​수 있습니까? https://github.com/pydata/pandas/issues – joris

+0

자세한 내용은 https://github.com/pydata/pandas/issues/8533을 참조하십시오. – joris

답변

0

에서
조쉬 쿤의 네티 SQLAlchemy의 방언, 나는 R 및 SQL Server를 사용하여, 그래서이 다를 수 있습니다. 내 대본에서 비슷한 문제가 발생했습니다. 외부 코드가 데이터베이스에서 실행될 수있는 T-SQL의 sp_execute_external_scriptselect 문만 허용합니다. 내가 저장 프로 시저를 실행하여 선택할 임시 테이블을 만들고 싶었 기 때문에 부담이되었습니다. 또는 공통 테이블 식, 공용체 등을 사용할 수 있습니다. 추가 조사가 필요합니다.