Я бы решил эту задачу так:
1. Pandas+sqllite, если объем выборок <30-50 тыс. записей и <10-12 колонок:
import pandas as pd
from sqlalchemy import create_engine
oracledb = create_engine('oracle://user:password@name') #name - название подключения в TNS файле
query = """
select /*+parallel(4)*/ 2 from dual
"""
data = pd.read_sql_query(query,oracledb,coerce_float=True)
print(data)
2. Pandas +conda+iopro (это коммерческий загрузчик с 30 дневной лицензией, подойдет для заливки 3-4 млн. записей):
import pandas as pd
import iopro.pyodbc as pdbc
conn_string = "DSN=OracleDSN;UID=user;PWD=password"
conn = pdbc.connect(conn_string)
query = """
select /*+parallel(4)*/ 2 from dual
"""
data = pd.DataFrame.from_dict(conn.cursor(query).fetchasarray(),orient='columns')
print(data)
3. Если данных больше 3-4 миллионов, то запрос вы в RAM не пробросите, но можно сделать так:
import pandas as pd
from sqlalchemy import create_engine
oracledb = create_engine('oracle://user:password@name') #name - название подключения в TNS файле
query = """
select /*+parallel(4)*/ 2 from dual
"""
data = pd.read_sql_query(query,oracledb,coerce_float=True,chunksize=10000)
for idx,chunk in enumerate(data):
print('Loading chunk %i'%idx)
chunk.to_csv('data_%i_chunk.csv'%idx,header=True,index=False)
4. Если данных еще больше, то советую посмотреть здесь
docs.oracle.com/cd/B25329_01/doc/admin.102/b25107/...