少し異なる状況で同じ問題が発生しました。+27000行のテーブルをクエリする必要がありましたが、しばらくするとcx_OracleがDBへの接続を切断することがわかりました。
dbへの接続が開いているときに、cx_Oracle.Lobオブジェクトのread()メソッドを使用して、dbを文字列に変換できます。ただし、クエリが大きすぎるテーブルをもたらす場合、接続はある時点で停止し、クエリの結果を読み取りたいときにcx_Oracleオブジェクトでエラーが発生するため、機能しません。
connection.callTimeout = 0(ドキュメントによると、これは無期限に待機することを意味します)を設定し、fetchall()を使用して結果をデータフレームまたはnumpy配列に配置するなど、多くのことを試しましたが、cx_Oracle.Lobオブジェクトを読み取ることができませんでした。
pandas.DataFrame.read_sql(query、connection)を使用してクエリを実行しようとすると、データフレームには接続が閉じられたcx_Oracle.Lobオブジェクトが含まれ、それらが役に立たなくなります。(これも、テーブルが非常に大きい場合にのみ発生します)
結局、理想的ではないとわかっていても、すぐにcsvファイルをクエリして作成することで、これを回避する方法を見つけました。
def csv_from_sql(sql: str, path: str="dataframe.csv") -> bool:
try:
with cx_Oracle.connect(config.username, config.password, config.database, encoding=config.encoding) as connection:
connection.callTimeout = 0
data = pd.read_sql(sql, con=connection)
data.to_csv(path)
print("FILE CREATED")
except cx_Oracle.Error as error:
print(error)
return False
finally:
print("PROCESS ENDED\n")
return True
def make_query(sql: str, path: str="dataframe.csv") -> pd.DataFrame:
if csv_from_sql(sql, path):
dataframe = pd.read_csv("dataframe.csv")
return dataframe
return pd.DataFrame()
+27000行のテーブルを表示するのに長い時間(約4〜5分)かかりましたが、他のすべてが機能しなかった場合は機能しました。
誰かがもっと良い方法を知っているなら、それは私にも役立つでしょう。