Быстрый импорт в базу данных с помощью DBeaver

 Сегодня расскажу про небольшой лайфхак о том, как можно быстро загрузить вашу дату в базу данных используя минимум кодинга. Но сначала опишем суть проблемы, которую данный лайфхак решает. Итак, у нас есть некая дата, которая хранится во внешних файлах (например, в csv). Нам нужно загрузить дату в базу данных (далее БД), причем в самой БД нет таблиц предназначенных для загрузки.


Делаем по старинке

Классическим решением будет провести анализ содержимого таблиц, выписать названия полей и их формат. Затем создать с помощью SQL запроса сами таблицы. Это будет выглядеть примерно вот так:



А затем нужно будет сформировать INSERT запрос для каждой строки файла для вставки его в БД. Если в вашем файле 30 тысяч строк, то придется писать запрос для каждой строки. Здесь без Excel или Google Sheets не обойтись. Так как используется инструментарий таблиц для работы со строками можно ускорить процесс создания тела INSERT запроса. Итоговый запрос может выглядеть вот так:



Остается только подключиться к БД и запустить SQL запросы. В этом  репозитарии на Гитхабе можно посмотреть на полный код самих запросов.

А что если вот совсем не хочется возиться с Excel и прописывать формулу для сцепки полей? А если в таблице 50-150 полей? Есть решение!


DBeaver приходит на помощь

 Воспользуемся функцией импорта данных в БД, которая появилась в версии 7.2.1

Перед тем как заливать дату, все таки придется создать таблицу-приёмник хотя бы с 1 полем (пусть это будет тот же id c типом serial). Вот таким запросом:


Создавать полную структуру таблицы со всеми полями и их типами не надо.
На этом наш кодинг и заканчивается. Далее действуем как на скриншотах. Выбираем в панели слева нашу БД и находим таблицу-приемник, через контекстное меню выбираем Импорт данных. На шаге указываем тип источника (CSV-файл) и таблицу-приемник (в моем примере rxl.os)


Дальше выбираем сам файл.



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



Теперь самое интересное. На шаге соответствия столбцов можно детально выбрать, куда какая информация будет копироваться. Для пустых таблиц будет предложен вариант create. Для таблиц, в которые уже была тестовая загрузка, или в которых структура была создана заранее, будет указано existing. А если вы хотите пропустить импорт определенного столбца, укажите skip, и DBeaver его пропустит.



На шаге параметров импорта можно включить опцию очистки существующих данных перед импортом (если вы тренировались и уже что-то в нее загружали), а также я рекомендую включить галочку "Выполнять Commit после вставки строк N" Где N -это шаг, через который будет выводится сообщение о статусе импорта. Так вы будете понимать примерно где сейчас импорт. Это актуально для больших таблиц размером от миллиона строк. Для таких больших таблиц удобный шаг - 100 000.


Затем переходим в окно подтверждения настроек и нажимаем старт. 



Сразу после этого начнется импорт. 



Скорость импорта зависит от размера файла-источника и удаленности таблицы-приемника. Мой импорт 0,5-миллиона строчек в облако Amazon занял примерно 10 минут.

Ложка дёгтя

Теперь о грустном. Если для вас важно, чтобы столбцы в итоговых таблицах соответствовали формату самих данных, то такой способ ваш огорчит. Все столбцы в таблицах-приёмниках будут созданы в текстовом формате (varchar).
В моем случае я заранее знал,  что затем буду подключаться к таблице с помощью BI-инструментария, который уже умеет распознавать формат и приводит его у нужному (Tableau, Power BI), поэтому для меня это ограничение было не важно.
Другим вариантом является дальнейшая работа с командами SQL типа CAST/CREATE CAST, CONVERT. Но это уже другая история.
Я же остановлюсь на этом. Если вам важна скорость закачки  и вы не делаете какой-то production, то импорт даты с помощью DBeaver является неплохим решением.




Комментарии

  1. Ответы
    1. При импорте таблицы подобным способом можно выбрать тип данных для каждого столбца импортируемого CSV файла

      Удалить

Отправить комментарий

Популярные сообщения из этого блога

Jupyter-фишки, которые облегчат жизнь аналитику

Два способа загрузить свой датасет в Python

5 приемов при работе с модулем datetime в Python

Чистка и препроцессинг данных. Готовим датасет для ML.