Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Tidak dapat membaca tabel SQL dengan benar di python:kolom varchar diimpor sebagai karakter/tupel yang dipisahkan koma

Ini sepertinya menjadi masalah saat menggunakan jaydebeapi dengan jpype . Saya dapat mereproduksi ini saat menghubungkan ke Oracle db dengan cara yang sama seperti yang Anda lakukan (dalam kasus saya Oracle 11gR2, tetapi karena Anda menggunakan ojdbc8.jar , saya rasa itu juga terjadi dengan versi lain).

Ada berbagai cara untuk menyelesaikan ini:

Ubah koneksi Anda

Karena kesalahan tampaknya hanya terjadi pada kombinasi paket tertentu, hal yang paling masuk akal untuk dilakukan adalah mencoba dan menghindari ini dan dengan demikian kesalahan sama sekali.

  1. Alternatif 1:Gunakan jaydebeapi tanpa jpype :

    Seperti yang dicatat, saya hanya mengamati ini saat menggunakan jaydebeapi dengan jpype . Namun, dalam kasus saya, jpype tidak diperlukan sama sekali. Saya memiliki .jar file secara lokal dan koneksi saya berfungsi dengan baik tanpanya:

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

    Dalam kasus saya, ini berfungsi dengan baik dan membuat kerangka data secara normal.

  2. Alternatif 2:Gunakan cx_Oracle sebagai gantinya:

    Masalah juga tidak terjadi jika saya menggunakan cx_Oracle untuk terhubung ke 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()
    

    Catatan:Untuk cx_Oracle untuk bekerja, Anda harus memiliki Klien Instan Oracle diinstal dan disiapkan dengan benar (lihat misalnya dokumentasi cx_Oracle untuk Ubuntu ).

Perbaiki kerangka data setelah fakta:

Jika karena alasan tertentu, Anda tidak dapat menggunakan alternatif koneksi di atas, Anda juga dapat mengubah kerangka data Anda.

  1. Alternatif 3:gabungkan entri tupel:

    Anda dapat menggunakan ''.join() untuk mengonversi tupel menjadi string . Anda perlu melakukan ini untuk entri dan nama kolom.

    # 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. Alternatif 4:ubah tipe kolom:

    Dengan mengubah dtype kolom yang terpengaruh dari object ke string , semua entri juga akan dikonversi. Perhatikan bahwa ini mungkin memiliki efek samping yang tidak diinginkan, seperti mis. mengubah None nilai ke string <N/A> . Selain itu, Anda harus mengganti nama judul kolom secara terpisah, seperti di atas.

    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)
    

Semua ini harus menghasilkan df yang kurang lebih sama pada akhirnya (terlepas dari dtypes dan kemungkinan penggantian None nilai):

+---+---------+---------+---------+
|   | 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. Cara Mengaktifkan Mode Log Arsip Di Oracle Database 19c

  2. 'ORA-00942:tabel atau tampilan tidak ada' hanya saat dijalankan dalam prosedur Tersimpan

  3. Kode untuk memanggil fungsi dalam paket dari C# dan ODP.NET

  4. Pengembang Oracle SQL:bagaimana cara melihat hasil dari kursor ref?

  5. Peringatan:ocifech() [function.ocifetch]:ORA-24374:definisikan tidak selesai sebelum mengambil atau mengeksekusi dan mengambil