Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

अजगर में SQL तालिका को ठीक से नहीं पढ़ा जा सकता:varchar कॉलम अल्पविराम से अलग वर्ण / tuples के रूप में आयात किया जाता है

jaydebeapi . का उपयोग करते समय यह एक समस्या प्रतीत होती है jpype . के साथ . ओरेकल डीबी से कनेक्ट होने पर मैं इसे पुन:उत्पन्न कर सकता हूं जैसे आप करते हैं (मेरे मामले में ओरेकल 11 जीआर 2, लेकिन चूंकि आप ojdbc8.jar का उपयोग कर रहे हैं , मुझे लगता है कि यह अन्य संस्करणों के साथ भी होता है)।

आप इसे विभिन्न तरीकों से हल कर सकते हैं:

अपना कनेक्शन बदलें

चूंकि त्रुटि केवल पैकेजों के एक विशिष्ट संयोजन में होती है, इसलिए सबसे समझदारी की बात यह है कि इनसे बचने की कोशिश करें और इस तरह पूरी तरह से त्रुटि करें।

  1. वैकल्पिक 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. वैकल्पिक 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 दस्तावेज़ीकरण )।

तथ्य के बाद डेटाफ़्रेम ठीक करें:

यदि किसी कारण से, आप उपरोक्त कनेक्शन विकल्पों का उपयोग नहीं कर सकते हैं, तो आप अपना डेटाफ़्रेम भी बदल सकते हैं।

  1. वैकल्पिक 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)
    
  2. वैकल्पिक 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     |
+---+---------+---------+---------+



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mybatis के साथ बैच डालने के लिए foreach का उपयोग करना

  2. एक विंडो में Oracle DBMS जॉब्स को कैसे शेड्यूल करें

  3. वर्चुअलबॉक्स VM के लिए लैपटॉप या डेस्कटॉप में BIOS में वर्चुअलाइजेशन को सक्षम करना

  4. बाहरी तालिकाओं के साथ ORA-29913 को कैसे हल करें

  5. एसक्यूएल कई फ़ील्ड के साथ डुप्लिकेट ढूंढें (कोई अद्वितीय आईडी नहीं) चारों ओर काम करें