2014-10-09 75 views
6

我正在將Python代碼轉換爲新的基於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) 

產生一個DB錯誤,該TEMP表tmptable不存在。據推測這是因爲將引擎傳遞給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的雨棚Python發行(Python的2.7.6)從https://github.com/deontologician/netezza_sqlalchemy

+0

你可以打開一個github問題作爲一個增強請求嗎?見https://github.com/pydata/pandas/issues – joris 2014-10-10 11:21:48

+0

請參閱https://github.com/pydata/pandas/issues/8533 – joris 2014-10-10 17:27:01

回答

0

您正在使用Python和Netezza公司
喬什 - 庫恩的Netezza公司SQLAlchemy的話,我用R和SQL服務器,所以這可能是不同的。在我的腳本中,我遇到了類似的問題。在T-SQL中允許外部代碼在數據庫上運行的sp_execute_external_script只允許select語句。這對我來說很沉重,因爲我想運行一個存儲過程來創建一個臨時表來進行選擇。或者,我可以使用公共表格表達式,工會等。這可能值得進一步調查。