Как выгрузить определенные поля таблицы из DB Oracle 11G в файл скриптом, написанным на Python 3.4?

Добрый день!
Делаю скрипт на Python 3.4, генерирующий ежедневный отчет из CI Jenkins, которая в свою очередь подключается к БД Oracle 11G. Никак не разберусь в библиотеке cx_Oracle и мануалу к ней (решил использовать ее).
Необходимо выгрузить определенные поля определенной таблицы (например, таблица USERS и поля USER_NAME и USER_DEPT).
#Подключаюсь так:
connection = cx_Oracle.connect('scott/tiger@oradb')
#Все подключается нормально, версия выводится...
connection.version

А вот с выборкой таблиц беда... Помогите пожалуйста?
  • Вопрос задан
  • 2928 просмотров
Решения вопроса 1
@lPolar
data scientist
Я бы решил эту задачу так:
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/...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Swartalf
вот один из старых примеров:

def get_query(sql):
con = cx_Oracle.connect('scott/tiger@oradb')
try:
cur = con.cursor()
cur.execute(sql)
result=cur.fetchone()
cur.close()
con.close()
if result is None:
#if query result in None return 0
return 0
return result[0]
except Exception, e:
return e

отступы расставьте сами:)
Ответ написан
@lnl Автор вопроса
Сделал как-то так пока:
connection = cx_Oracle.connect('scott/tiger@oradb')
db_cursor=connection.cursor()
db_cursor.execute("""
SELECT USER_NAME, USER_DEPT
FROM USERS
ORDER BY USER_NAME""")

Помогите скорректировать что бы "это" работало? И как это потом выгрузить в файл? Что записывать в переменную - курсор?
Ответ написан
Комментировать
1na1
@1na1
Hello, world!
Алексей М., для получения результата выборки нужно использовать метод fetchall() (или подобный) объекта Cursor. Ниже пример.

Ссылка на документ: cx-oracle.readthedocs.io/en/latest/cursor.html#Cur...

connection = cx_Oracle.connect('scott/tiger@oradb')
db_cursor=connection.cursor()
db_cursor.execute("""
SELECT USER_NAME, USER_DEPT
FROM USERS
ORDER BY USER_NAME""")

# получение результата
result = db_cursor.fetchall()
print(result)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы