Время прочтения: 3 мин.

В предыдущей статье мы рассмотрели, как с помощью Python можно создать и запустить SQL запрос с множеством условий для выгрузки информации из баз данных (БД) Oracle в один файл частями.

В данной статье мы расскажем, как использовать рассмотренный скрипт (частично изменив его) для выгрузки записей из различных несвязанных таблиц в отдельные файлы.

Не секрет, что прежде чем писать SQL запросы к таблицам БД для формирования выгрузок, необходимо проанализировать, какая информация в них содержится. Особенно это актуально в случае, если описание к БД отсутствует (что в нашей работе встречается нередко). Для этого, например, можно выгрузить небольшое количество записей из нужных таблиц в отдельные файлы excel. При этом зачастую таблиц, которые необходимо изучить, довольно много. Чтобы не выгружать информацию из каждой вручную можно воспользоваться Python. Ниже мы рассмотрим, как это сделать на примере БД Oracle.

Для начала создадим txt файл с названием «dt_in.txt», в котором укажем таблицы для выгрузки данных в следующем виде:

Название_базы_данных_1.Название_таблицы_1;

Название_базы_данных_1.Название_таблицы_2;

Название_базы_данных_2.Название_таблицы_1;

Название_базы_данных_3.Название_таблицы_1

Обратите внимание, в файле не должно быть пробелов и пустых строк, в том числе после названия последней таблицы в списке. Указать можно таблицы разных БД.

Далее запускаем скрипт на Python (импорт библиотек, подключение к Oracle, описание функций для взаимодействия с Oracle и выполнения запроса можно найти в указанной выше статье).

#Имя файла со строками вида base_name.table_name;
fn = 'dt_in.txt'

#Чтение входного файла с именами баз данных и таблиц
f = open(fn,'r',encoding='UTF-8') 

#Ключ для записи заголовков, если h=0, то происходит первый проход по циклу - записываем в файл заголовки, 
#если h=1 - не первый проход по циклу, заголовки записаны
h=0
l = 0 
#Счетчик строк для запуска основного SQL-запроса
for row in f:
    
    dt = row.split(";")
    
    #Имя файла в который выгружаем
    new_file = str(dt[0].replace('\n',''))
    l += 1
    
    #SQL-запрос (количество выгружаемых строк можно менять)
    sql = """SELECT * FROM """ + str(dt[0].replace('\n','')) + """ where rownum<400"""
    
    #Проверка на наличие записей в таблице. Если записей в таблице нет, файл с ее именем не создается, 
    #дальнейшая ее выгрузка не производится
    count= """SELECT count(*) FROM """ + str(dt[0].replace('\n','')) + """ where rownum<3"""
    with getOdsConn(odsLogin,odsConnectStr) as con1:
        _header,result,us = dfFromOracle(con1, count)
        if result.values[0,0]==0:
            print("Таблица " + new_file + " пустая")
            continue
       
    #Выполнение основного SQL-запроса
    with getOdsConn(odsLogin,odsConnectStr) as con1:
        _header,result,us = dfFromOracle(con1, sql)
        
        #Запись заголовков в выходной файл
        if h==0:
            header = ';'.join(_header)+'\n'
            myfile=open(new_file + '.csv', 'w',encoding='UTF-8')
            myfile.writelines(header)
            myfile.close()
            h=1
            
    #Запись выгруженных строк таблиц в файлы   
    result.to_csv(new_file + '.csv', sep=';',encoding='UTF-8',mode='a',header=None)
    print('Выгружено ' + str(len(result)) + ' из ' + str(new_file) )
        
f.close()

В результате данные из таблиц автоматически выгружаются в отдельные файлы excel, названия которых содержат наименование БД и таблицы. Если таблица пустая – файл не формируется. В Python выводится сообщение о том, сколько записей выгружено из каждой таблицы, или, что она пустая.

Таким образом, с помощью Python можно:

—  уменьшить трудозатраты на выгрузку информации для анализа из несвязанных таблиц БД в отдельные файлы;

— выгружать данные для анализа сразу из нескольких БД.