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.
-
Alternatif 1:Gunakan
jaydebeapi
tanpajpype
:Seperti yang dicatat, saya hanya mengamati ini saat menggunakan
jaydebeapi
denganjpype
. 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.
-
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.
-
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)
-
Alternatif 4:ubah tipe kolom:
Dengan mengubah
dtype
kolom yang terpengaruh dariobject
kestring
, semua entri juga akan dikonversi. Perhatikan bahwa ini mungkin memiliki efek samping yang tidak diinginkan, seperti mis. mengubahNone
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 |
+---+---------+---------+---------+