2014-10-09 8 views
6

मैं पाइथन कोड को नए SQLAlchemy- आधारित पांडस 0.14.1 में परिवर्तित करने की प्रक्रिया में हूं। एक बार कनेक्शन अस्थायी तालिकाओं डीबी सर्वर द्वारा पर्ज किए बंद कर दिया हैpandas.read_sql_query() एक टेम्पलेट तालिका क्वेरी कैसे कर सकता है?

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

अब:

एक आम पैटर्न हम का उपयोग करें (सामान्य रूप से) है। हालांकि, अंतिम चयन क्वेरी एक ही कनेक्शन/सत्र का उपयोग कर रही है, इसलिए यह टेबल तक पहुंच सकती है।

मैं 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 त्रुटि है कि अस्थायी तालिका tmptable मौजूद नहीं है अर्जित करता है। संभवतः ऐसा इसलिए है क्योंकि read_sql_query() को इंजन को पास करने के लिए इसे एक नया कनेक्शन खोलने की आवश्यकता होती है जिसमें एक स्वतंत्र सत्र स्कोप होता है और इसलिए TEMP तालिका नहीं देख पाती है। क्या यह एक उचित धारणा है?

क्या इसके आसपास काम करने का कोई तरीका है? (read_sql_query() से कनेक्शन पास करने के लिए समर्थित नहीं है)

(मुझे पता है कि मैं एसक्यूएल को एक स्ट्रिंग में जोड़ सकता हूं; बयान को अलग करना, लेकिन यह वास्तविक स्थिति का सरलीकरण है जहां टीईएमपी टेबल हैं कार्यों की एक भीड़ द्वारा बनाई गई है जो दूसरों को 3-4 गहरी घोंसला देती है। इसलिए, इसे प्राप्त करने के लिए इसे जारी करने से पहले कई कॉलों में एसक्यूएल को जोड़कर एक परत को लागू करने की आवश्यकता होगी, जो कि अगर कोई अच्छा तरीका है तो मैं इसे लागू करने से बचूंगा)

का उपयोग करना -
पांडा: 0.14.1
SQLAlchemy: 0.9.7
pyodbc: 3.0.6
Win7 x86_64 चंदवा अजगर वितरण (अजगर 2.7.6) से https://github.com/deontologician/netezza_sqlalchemy

+0

क्या आप इसके लिए एक वृद्धि अनुरोध के रूप में एक जिथब मुद्दा खोल सकते हैं? Https://github.com/pydata/pandas/issues – joris

+0

देखें और देखें https://github.com/pydata/pandas/issues/8533 – joris

उत्तर

0

आप अजगर और Netezza उपयोग कर रहे हैं
जोश कुह्न के Netezza SQLAlchemy बोली, मैं आर और एसक्यूएल सर्वर उपयोग कर रहा था, तो यह अलग हो सकता है। मेरी लिपि में, मैं एक समान मुद्दे में भाग गया। टी-एसक्यूएल में sp_execute_external_script जो डेटाबेस पर चलाने के लिए बाहरी कोड की अनुमति देता है केवल select बयान के लिए अनुमति देता है। यह मेरे लिए बोझिल था क्योंकि मैं चुनने के लिए एक टेम्पलेट टेबल बनाने के लिए एक संग्रहीत प्रक्रिया को चलाने के लिए चाहता था। वैकल्पिक रूप से, मैं सामान्य टेबल अभिव्यक्तियों, यूनियनों आदि का उपयोग कर सकता हूं। यह आगे की जांच के लायक हो सकता है।

संबंधित मुद्दे