jaydebeapi
. का उपयोग करते समय यह एक समस्या प्रतीत होती है jpype
. के साथ . ओरेकल डीबी से कनेक्ट होने पर मैं इसे पुन:उत्पन्न कर सकता हूं जैसे आप करते हैं (मेरे मामले में ओरेकल 11 जीआर 2, लेकिन चूंकि आप ojdbc8.jar
का उपयोग कर रहे हैं , मुझे लगता है कि यह अन्य संस्करणों के साथ भी होता है)।
आप इसे विभिन्न तरीकों से हल कर सकते हैं:
अपना कनेक्शन बदलें
चूंकि त्रुटि केवल पैकेजों के एक विशिष्ट संयोजन में होती है, इसलिए सबसे समझदारी की बात यह है कि इनसे बचने की कोशिश करें और इस तरह पूरी तरह से त्रुटि करें।
-
वैकल्पिक 1:
jaydebeapi
का उपयोग करें बिनाjpype
. के :जैसा कि उल्लेख किया गया है, मैं केवल
jaydebeapi
. का उपयोग करते समय इसका निरीक्षण करता हूंjpype
. के साथ . हालांकि, मेरे मामले में,jpype
बिल्कुल जरूरत नहीं है। मेरे पास.jar
. है स्थानीय रूप से फ़ाइल करें और मेरा कनेक्शन इसके बिना ठीक काम करता है:import jaydebeapi as jdba import pandas as pd import os db_host = 'db.host.com' db_port = 1521 db_sid = 'YOURSID' jar=os.getcwd()+'/ojdbc6.jar' conn = jdba.connect('oracle.jdbc.driver.OracleDriver', 'jdbc:oracle:thin:@' + db_host + ':' + str(db_port) + ':' + db_sid, {'user': 'USERNAME', 'password': 'PASSWORD'}, jar ) df_jay = pd.read_sql('SELECT * FROM YOURSID.table1', conn) conn.close()
मेरे मामले में, यह ठीक काम करता है और सामान्य रूप से डेटाफ़्रेम बनाता है।
-
वैकल्पिक 2:
cx_Oracle
का उपयोग करें इसके बजाय:यदि मैं
cx_Oracle
. का उपयोग करता हूं तो भी समस्या उत्पन्न नहीं होती है Oracle db से कनेक्ट करने के लिए:import cx_Oracle import pandas as pd import os db_host = 'db.host.com' db_port = 1521 db_sid = 'YOURSID' dsn_tns = cx_Oracle.makedsn(db_host, db_port, db_sid) cx_conn = cx_Oracle.connect('USERNAME', 'PASSWORD', dsn_tns) df_cxo = pd.read_sql('SELECT * FROM YOURSID.table1', con=cx_conn) cx_conn.close()
नोट:
cx_Oracle
. के लिए काम करने के लिए आपके पास Oracle Instant Client होना चाहिए। स्थापित और ठीक से सेट अप (उदाहरण देखें उबंटू के लिए cx_Oracle दस्तावेज़ीकरण )।
तथ्य के बाद डेटाफ़्रेम ठीक करें:
यदि किसी कारण से, आप उपरोक्त कनेक्शन विकल्पों का उपयोग नहीं कर सकते हैं, तो आप अपना डेटाफ़्रेम भी बदल सकते हैं।
-
वैकल्पिक 3:टपल प्रविष्टियों में शामिल हों:
आप
''.join()
. का उपयोग कर सकते हैं करने के लिए टुपल्स को स्ट्रिंग्स में बदलें . आपको यह प्रविष्टियों और कॉलम नामों के लिए करने की आवश्यकता है।# for all entries that are not None, join the tuples for col in df.select_dtypes(include=['object']).columns: df[col] = df[col].apply(lambda x: ''.join(x) if x is not None else x) # also rename the column headings in the same way df.rename(columns=lambda x: ''.join(x) if x is not None else x, inplace=True)
-
वैकल्पिक 4:कॉलम के प्रकार बदलें:
dtype
. में बदलाव करकेobject
. से प्रभावित कॉलम का करने के लिएstring
, सभी प्रविष्टियों को भी परिवर्तित किया जाएगा। ध्यान दें कि इसके अवांछित दुष्प्रभाव हो सकते हैं, जैसे उदा।None
बदल रहा है स्ट्रिंग के मान<N/A>
. साथ ही, आपको ऊपर बताए अनुसार कॉलम शीर्षकों का अलग से नाम बदलना होगा।for col in df.select_dtypes(include=['object']).columns: df[col] = df[col].astype('string') # again, rename headings df.rename(columns=lambda x: ''.join(x) if x is not None else x, inplace=True)
इन सभी को कमोबेश एक जैसा df
मिलना चाहिए अंत में (dtypes
. के अलावा और None
. का संभावित प्रतिस्थापन मान):
+---+---------+---------+---------+
| | COLUMN1 | COLUMN2 | COLUMN3 |
+---+---------+---------+---------+
| 1 | test | test2 | 1 |
+---+---------+---------+---------+
| 2 | foo | bar | 100 |
+---+---------+---------+---------+