2014-10-09 9 views
6

Tôi đang trong quá trình chuyển đổi mã Python sang Pandas 0.14.1 dựa trên SQLAlchemy mới.Làm thế nào có thể pandas.read_sql_query() truy vấn một bảng TEMP?

Một mô hình chung chúng tôi sử dụng là (tổng quát):

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

Bây giờ, khi kết nối được đóng các bảng TEMP đều bị loại bỏ bởi máy chủ DB. Tuy nhiên, khi truy vấn chọn cuối cùng đang sử dụng cùng một kết nối/phiên, nó có thể truy cập các bảng.

Làm cách nào tôi có thể đạt được tương tự bằng cách sử dụng SQLAlchemy và pd.read_sql_query()?

Ví dụ:

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) 

mang lại một lỗi DB rằng tmptable bảng TEMP không tồn tại. Có lẽ điều này là bởi vì đi qua động cơ để read_sql_query() đòi hỏi nó để mở một kết nối mới trong đó có một phạm vi phiên độc lập và do đó không thể nhìn thấy bảng TEMP. Đó có phải là một giả định hợp lý không?

Có cách nào để giải quyết vấn đề đó không? (chuyển kết nối tới read_sql_query() không được hỗ trợ)

(Tôi biết rằng tôi có thể nối SQL vào một chuỗi đơn lẻ; tách các câu lệnh, nhưng đây là sự đơn giản hóa tình huống thực tế nơi các bảng TEMP là Vì vậy, để đạt được điều đó sẽ yêu cầu thực hiện một lớp hơn có thể kết hợp SQL qua nhiều cuộc gọi trước khi phát hành nó, mà tôi muốn tránh thực hiện nếu có một cách đẹp hơn)

Sử dụng -
Pandas: 0.14.1
SQLAlchemy: 0.9.7
pyodbc: 3.0.6
Win7 x86_64 Canopy Python phân phối (Python 2.7.6) phương ngữ Netezza SQLAlchemy
Josh Kuhn từ https://github.com/deontologician/netezza_sqlalchemy

+0

Bạn có thể mở vấn đề github cho yêu cầu nâng cao này không? Xem https://github.com/pydata/pandas/issues – joris

+0

Xem thêm https://github.com/pydata/pandas/issues/8533 – joris

Trả lời

0

Bạn đang sử dụng Python và Netezza, tôi đã sử dụng R và SQL Server, vì vậy đây có thể là khác nhau. Trong kịch bản của tôi, tôi chạy vào một vấn đề tương tự. sp_execute_external_script trong T-SQL cho phép mã bên ngoài chạy trên cơ sở dữ liệu chỉ cho phép các câu lệnh select. Điều này là gánh nặng cho tôi bởi vì tôi muốn chạy một thủ tục lưu trữ để tạo ra một bảng tạm thời để lựa chọn. Ngoài ra, tôi có thể sử dụng các biểu thức bảng chung, các công đoàn, v.v. Nó có thể đáng được điều tra thêm.

Các vấn đề liên quan