Вы находитесь на странице: 1из 1

КАК СТАТЬ АВТОРОМ Финал Битвы — через неделю Войти

Все потоки Разработка Администрирование Дизайн Менеджмент Маркетинг Научпоп

KiraD 30 мар 2022 в 11:48

Импорт и экспорт данных в PostgreSQL, гайд для начинающих


3 мин 90K

PostgreSQL*, SQL*

Из песочницы

В процессе обучения аналитике данных у человека неизбежно возникает вопрос о миграции


данных из одной среды в другую. Поскольку одним из необходимых навыков для аналитика
данных является знание SQL, а одной из наиболее популярных СУБД является PostgreSQL,
предлагаю рассмотреть импорт и экспорт данных на примере этой СУБД.
+2 103 7 +7

В своё время, столкнувшись с импортом и экспортом данных, обнаружилось, что какой-то более-
менее структурированной инфы мало: этот момент обходят на всяких там курсах по аналитике,
подразумевая, что это очень простые моменты, которым не следует уделять внимание.

В данной статье приведены примеры импорта в PostgreSQL непосредственно самой базы данных
в формате sql, а также импорта и экспорта данных в наиболее простом и распространенном
формате .csv, в котором в настоящее время хранятся множество существующих датасетов.
Формат .json хоть и является также очень распространенным, рассмотрен не будет, поскольку, по
моему скромному мнению, с ним все-таки лучше работать на Python, чем в SQL.

1. Импорт базы данных в формате в PostgreSQL


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

C:\Users\User-N\Desktop\БД

Имя файла: demo-big-20170815

Далее понадобиться командная строка windows или SQL shell (psql). Для примера воспользуемся
cmd. Переходим в каталог, где находится скачанная БД, командой cd C:\Users\User-
N\Desktop\БД :

Далее выполняем команду для загрузки БД из sql-файла:

"C:\Program Files\PostgreSQL\10\bin\psql" -U postgres -f demo-big-20170815.sql

Где сначала указывается путь, по которому установлен PostgreSQL на компьютере, -U – имя


пользователя, -f - название файла БД.

Отметим, что в зависимости от размера базы данных загрузка может занимать до нескольких
десятков минут. Конец загрузки будет отмечен следующим видом:

Заходим в pgAdmin и наблюдаем там импортированную БД:

С таблицами:

2. Импорт данных из csv-файла


Предполагается, что у вас уже есть необходимый .csv-файл, и первое, что нужно сделать, это
перейти pgAdmin и создать там новую базу данных. Ну или воспользоваться уже существующей,
в зависимости от текущих нужд. В данном случае была создана БД airtickets.

В выбранной БД создается таблица с полями, типы которых должны соответствовать «колонкам»


в выбранном .csv-файле.

Далее воспользуемся SQL shell (psql) для подключения к нужной БД и для подачи команд на
импорт данных. При открытии SQL shell (psql) она стандартно спросит про имя сервера, имя
подключаемой БД, порт и пользователя. Ввести нужно только имя БД и пароль пользователя, всё
остальное проходим нажатием ентра. Создается подключение к нужной БД – airtickets.

Ну и вводим команды на импорт данных из файла:

\COPY tickets FROM ‘C:\Users\User-N\Desktop\CSV\ticket_dataset_MOW.csv’ DELIMITER


‘,’ CSV HEADER;

Где tickets – название созданной в БД таблицы, из – путь, где хранится .csv-файл, DELIMITER
‘,’ – разделитель, используемый в импортируемом .csv-файле, сам формат файла и HEADER ,
указывающий на заголовки «колонок».

Один интересный момент. Написание команды COPY строчными (маленькими) буквами привело
к тому, что psql ругнулся, выдал ошибку и предложил написать команду прописными буквами.

Заходим в pgAdmin и удостоверяемся, что данные были загружены.

3. Экспорт данных в .csv-файл


Предположим, нам надо сохранить таблицу airports_data из уже упоминаемой выше БД demo.

Для этого подключимся к БД demo через SQL shell (psql) и наберем команду, указав уже знакомые
параметры разделителя, типа файла и заголовка:

\COPY airports_data TO ‘C:\Users\User-N\Desktop\CSV\airports.csv’ DELIMITER ‘,’


CSV HEADER;

Существует и другой способ экспорта через pgAdmin: правой кнопкой мыши по нужной таблице –
экспорт – указание параметров экспорта в открывшемся окне.

4. Экспорт данных выборки в .csv-файл


Иногда возникает необходимость сохранить в .csv-файл не полностью всю таблицу, а лишь
некоторые данные, соответствующие некоторому условию. Например, нам нужно из БД demo
таблицы flights выбрать поля flight_id, flight_no, departure_airport, arrival_airport, где
departure_airport = 'SVO'. Данный запрос можно вставить сразу в команду psql:

\COPY (SELECT flight_id, flight_no, departure_airport, arrival_airport FROM


flights WHERE departure_airport = 'SVO') TO ‘C:\Users\User-
N\Desktop\CSV\flights_SVO.csv' CSV HEADER DELIMITER ',';

Вот такой небольшой гайд получился.

Теги: Импорт экспорт данных в PostgreSQL, импорт и экспорт в csv, psql команда copy

Хабы: PostgreSQL, SQL

Редакторский дайджест
Присылаем лучшие статьи раз в месяц

Электропочта

4 0
Карма Рейтинг

@KiraD
Пользователь

Комментарии 7

phaggi 30 мар 2022 в 13:17

Как я понял, плоскую таблицу загрузили в таблицу БД без связи с другими таблицами БД.

А как загружать то же самое, если некоторые поля должны лечь в другие таблицы БД, а в данной
таблице должны появиться соответствующие id из тех таблиц, связанных с этой?

0 Ответить

lizergil 30 мар 2022 в 17:39

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

+1 Ответить

phaggi 30 мар 2022 в 20:08

Признаться, я тоже догадывался об этой необходимости. Вопрос в том, как это лучше сделать.
Заглядывая сюда, я ожидал увидеть именно такой пример.

Где лучше посмотреть пример грамотного решения?

0 Ответить

KiraD 31 мар 2022 в 03:24

Вы про загрузку нескольких .csv-файлов в новую БД? А никак не лягут, если это потом не прописать
кодом. Попробую следующей статьей показать на примере. Если Вы именно это имели ввиду.

+1 Ответить

phaggi 31 мар 2022 в 07:50

Нет. Я про загрузку одной main csv, в которой, к примеру, есть колонки, которые содержат часто
повторяющиеся значения, и которые должны быть вынесены в отдельную таблицу со своими
индексами и связаны с нашей main таблицей связью один ко многим. Например, название филиала.

То-есть, возможно, надо при загрузке сразу список уникальных названий филиала загрузить в
другую таблицу, а при загрузке основной csv видимо делать поиск в таблице «филиалы» по
значению, а помещать в основную таблицу номер соответствующего индекса из «филиалы».

Или наоборот, грузить main как есть, а потом делать что-то вроде создания новой таблицы по select
filials from main group by filials, создания там индекса и создания в main новой колонки filial_id со
связью, а колонку main.filials удаляем. Я так делал, но правильно ли это?

Или ещё как… Сделать функцию добавления новой строки, разбирающую строку исходной csv и
раскладывающую нужные поля по уже созданным пустым таблицам и формирующую финальный
insert для main уже с правильными значениями filial_id… медленно, но верно…тогда эта функция
будет полезна в дальнейшем для пополнения или обновления.

0 Ответить

ArchDemon 31 мар 2022 в 09:08

Можете попробовать через Pentaho Data Integration или Apache NiFi

+1 Ответить

a14e 1 апр 2022 в 08:57

Вероятно вам стоит сделать в другой бд буферную таблицу, потом на основе нее сделать что-то вроде

insert .... from select ...

Если это повторяющийся процесс, то посмотрите в сторону различных etl решений, например, nifi ,
apache airflow

Если вы хотите выгрузить таблицу + связи, то вероятно вам потребуется выгрузка через pg_dump

0 Ответить

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Публикации

ЛУЧШИЕ ЗА СУТКИ ПОХОЖИЕ

Lunathecat 17 часов назад

Секретная плата с китайского экзамена по электронике


Простой 8 мин 14K

Кейс

+38 52 10 +10

Erwinmal 21 час назад

Царьпанк под развесистой клюквой: стали ли стереотипы о


дореволюционной России отдельным жанром?
Простой 11 мин 4.7K

Обзор

+38 20 11 +11

GeeksCat 23 часа назад

Как создавался Halo


Простой 15 мин 1.7K

Ретроспектива

+21 9 0

dzot_dev вчера в 09:00

Проектируйте правильно
Сложный 11 мин 6.1K

Из песочницы

+21 72 1 +1

olga_ryabukhina 23 часа назад

Что эффективнее — усложнять модель или увеличивать количество


данных?
Простой 8 мин 3.8K

Из песочницы

+18 31 3 +3

xeovo 18 часов назад

Как оплатить VPN из России рублями


2 мин 7.9K

+14 34 8 +8

SLY_G 23 часа назад

На крупнейшую медицинскую страховую компанию США подали иск из-


за использования ИИ с 90%-ным процентом ошибок
7 мин 4.5K

Перевод

+13 7 15 +15

Seleditor 6 часов назад

Китай превращает современные видеокарты GeForce RTX 4090 в ИИ-


ускорители. Что происходит?
4 мин 4.7K

+11 8 7 +7

stasgersa92 18 минут назад

Путь к мечте: как инвалидность не помешала стать разработчиком и


продолжить борьбу за здоровье
Простой 7 мин 104

Из песочницы

+9 1 1 +1

rpiontik 10 часов назад

Мама
Простой 8 мин 5.7K

Ретроспектива

+9 4 6 +6

У кого на Руси работать хорошо


Спецпроект

Показать еще

ИСТОРИИ

Идём на «Импульс Как стать Рейтинг IT-брендов Активность найма в Перевернуть


Т1» по дороге из супергероем работодателей 2023 3 квартале 2023 календарь и
жёлтого кирпича добавить событие

ЗАКАЗЫ

Настроить SSO Apple в iOS App, SwiftUI


10000 руб./за проект · 6 просмотров

Настроить интеграцию с Stripe, SendPulse в backend сервисе на Python


25000 руб./за проект · 1 отклик · 6 просмотров

Импорт CSV данных, создание постов Wordpress, API GPT-4


800 руб./в час · 3 отклика · 19 просмотров

2Д анимация в After Effects (рекламный ролик напитка на 1 мин)


2500 руб./за проект · 1 отклик · 26 просмотров

Программа для рассылки электронных писем


7000 руб./за проект · 3 отклика · 30 просмотров

Больше заказов на Хабр Фрилансе

МИНУТОЧКУ ВНИМАНИЯ

Турбо Спецпроект Интересно

Почему ИИ не воспринимают как Помогаем делать взвешенный Глупым вопросам и ошибкам —


благо выбор с 2020 года быть! IT-менторство на ХК

Настройка языка

Техническая поддержка

© 2006–2023, Habr

Вам также может понравиться