Выгружаем из базы данных с помощью Python
Задача на выгрузку данных из одной таблицы, с одним условием для фильтра решается посредством создания простого SQL-запроса. Но она легко становится трудоемкой в исполнении, если в фильтрации применить множество условий. Давайте представим, что необходимо выгрузить данные из одной таблицы по фильтру, где первые две цифры ИНН начинаются на «66». SQL-запрос будет выглядеть так:
Вроде ничего сложного, но, если изменить условие фильтрации на поиск по 2 млн уникальных ИНН, SQL-запрос будет выглядеть так:
Исходя из своего опыта, такой запрос запустить не получится из-за ограничения СУБД на количество условий в 10 тыс. значений (Ограничения СУБД могут быть разные). В нашем случае потребуется создать 200 запросов и запустить их по отдельности. В итоге мы получим 200 файлов с данными, которые необходимо собрать в один. Сложно представить сколько потребуется на это времени и сил, но с помощью Python и библиотеки «cx_Oracle» задача решается легко.
Используем библиотеки:
Проверяем версию (должна быть > 3.0):
Прописываем дескриптор соединения Oracle:
Прописываем логин и пароль (при доменной аутентификации оставляем '/'):
Функция, в которой создается экземпляр класса connect, он обеспечит взаимодействие с сервером Oracle:
Функция, в которой создается курсор и выполняется запрос:
Подключаемся к серверу:
Файл, в котором одна колонка со всеми значениями ИНН:
Присваиваем имя файла, в который выгрузится результат:
r='' - для собора строк в «with», которые подставим в SQL-запрос,
h = 0 - проверки наличия заголовков,
l = 0 — счетчик строк для запуска SQL-запроса,
ll = 0 — счетчик строк для проверки на остаток,
cnt = 10000 — количество строк для запуска SQL-запроса.
Цикл для создания и запуска SQL-запросов:
Отправляем SQL-запрос и обрабатываем полученную выгрузку:
Таким образом, с помощью Python мы автоматизировали процесс создания, запуска SQL-запросов и сохранения результатов в один файл, избежали больших трудозатрат, при этом:
- исключили ошибки, возможные при перечислении списка условий для фильтрации, что снизило вероятность потери данных;
- настроили процесс создания, запуска SQL-запросов и сохранения результатов в один файл порционно, что дает возможность в случае обрыва сессии не повторять заново запросы с уже отработавшими условиями, а продолжить с условий, на которых обрыв произошел.
Недавно Роналду стукнуло 40 лет. В честь этого я приготовил блюда из его рациона и посчитал бюджет. В этой статье вы узнаете, чем обедает один из лучших игроков мира, и почему вы тоже так можете. В конце покажу цены и принципы питания для кубиков пресса.
Тренд текущего времени - впарить себя через чат с ником похожим на собачью кличку и оплатой криптой. Оплата конечно же вперед и 100%.
Речь пойдёт о подготовке и быстрой продаже бизнеса, Ресторан/ кафана "Београд" в г. Тюмени. Сначала задача стояла увеличить поток клиентов!🧚♂ Мы провели TWM- анализ бизнес объекта подготовили проект рекомендаций с прогнозом результатов.📝 Что сделали❓ естественно в местах, которые были указаны в плане модификаций ТWM (кратко): Обозначили цв…
Журналисты отмечают хорошее время работы на одном заряде и неплохую заднюю камеру, но недовольны отсутствием MagSafe.
Создание резерва поспособствует развитию «критически важной индустрии».
Обычно все рассказывают, как ушли из найма и открыли многомиллионный бизнес, а тут всё шиворот-навыворот. Но это отнюдь не история провала, прочтёшь и сделаешь выводы сам...
Мисье знает толк в изврашениях 🙂
1) почему не оператор IN?
2) можно вставить ваши инн во временную таблицу и сделать join с ней
3) файл с инн можно подключить в оракл как таблицу и использовать п. 2
1) почему не оператор IN?
У оператора IN ограничение в 1 000 значений, а OR ограничен настройками СУБД (в нашем случае это 10 000 значений).
Если не обращать внимание на ограничения, то оператор IN хорошо использовать для написания компактного запроса, но он в момент исполнения все равно преобразовывается в OR.
2) можно вставить ваши инн во временную таблицу и сделать join с ней
Запустить в PL/SQL Developer запрос в котором более 2 000 000 строк кода проблематично, а если получиться, то опять возникает ограничение в СУБД.
3) файл с инн можно подключить в оракл как таблицу и использовать п.2
Если не обращать внимание на ограничения в СУБД, то использовать Python более надежней, при обрыве сессии можно начать выгрузку с момента обрыва.
P.s. С Вашими предложениями в п.2 и п.3 согласны, но применить к описанной задаче не получиться, все упирается в ограничения СУБД.
Месье или (канонически месьё)
Если это одноразовая задача, не проще было бы получить все данные из таблицы и отфильровать регуляркой? 2млн записей это не так уж и много.
> Сложно представить сколько потребуется на это времени и сил, но с помощью Python и библиотеки «cx_Oracle» задача решается легко.
Так поди не с помощью библиотеки, а с помощью вендорного ПО?
Начало и заголовок статьи как-то не дает понять, что будет речь про оракл.