Импорт и экспорт данных: COPY, LOAD DATA INFILE, IMPORT/EXPORT
Зачем нужен импорт и экспорт данных? 📦
Работа с базами данных — это не только запросы и аналитика. Часто нам нужно:
- Переносить данные между системами (например, из CSV в PostgreSQL)
- Делать бэкапы
- Интегрироваться с другими сервисами
- Обрабатывать большие массивы данных из внешних файлов
Сегодня разберём три мощных инструмента для этих задач!
COPY — скоростной магистральный канал 🚀
COPY — это стандартная команда SQL для быстрого импорта/экспорта данных. Работает в PostgreSQL и других СУБД.
Экспорт данных в CSV
COPY sales TO '/path/to/sales.csv' WITH CSV HEADER;
sales— таблица для экспортаWITH CSV— формат файлаHEADER— включить заголовки столбцов
Импорт данных из CSV
COPY customers FROM '/path/to/customers.csv' WITH CSV HEADER;
Важно: Файл должен быть доступен серверу БД, а не только вашему локальному компьютеру!
Плюсы COPY:
✔️ Очень высокая скорость
✔️ Поддержка бинарного формата для максимальной производительности
✔️ Гибкие настройки формата
LOAD DATA INFILE — тяжелая артиллерия MySQL 💣
Эксклюзивный инструмент MySQL для загрузки больших файлов.
Базовый пример:
LOAD DATA INFILE '/path/to/products.txt'
INTO TABLE products
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
- Читает данные из текстового файла
- Автоматически определяет структуру (или использует указанную)
- Поддерживает сложные форматы
Оптимизация для больших файлов:
LOAD DATA INFILE '/large/file.csv'
INTO TABLE analytics
CHARACTER SET utf8mb4
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES -- пропустить заголовок
(column1, column2, @dummy) -- маппинг столбцов
SET date_loaded = NOW(); -- дополнительные вычисления
IMPORT/EXPORT — кроссплатформенное решение 🌐
Многие СУБД предлагают свои варианты этих команд:
В SQLite:
-- Экспорт
.headers on
.mode csv
.output data.csv
SELECT * FROM users;
В Oracle:
-- Импорт через SQL*Loader
OPTIONS (SKIP=1) -- пропустить первую строку
LOAD DATA
INFILE 'data.dat'
BADFILE 'bad_rows.bad'
APPEND
INTO TABLE employees
FIELDS TERMINATED BY ","
(emp_id, emp_name, salary)
Лайфхаки для профессионалов 🔥
- Пакетная обработка: Для огромных файлов разбивайте импорт на части по 10-50k строк
- Валидация: Добавляйте временные CHECK-ограничения при импорте
- Логирование: Создайте таблицу-журнал для отслеживания импортов
Пример журналирования:
BEGIN;
CREATE TEMP TABLE import_log (ts timestamp, rows_affected int);
COPY data FROM '/file.csv' WITH CSV;
INSERT INTO import_log VALUES (NOW(), (SELECT COUNT(*) FROM data));
COMMIT;
Что выбрать для вашей задачи? 🤔
| Инструмент | Лучше всего подходит для... |
|---|---|
| COPY | Быстрого переноса между PostgreSQL и CSV |
| LOAD DATA INFILE | Обработки огромных файлов в MySQL |
| IMPORT/EXPORT | Работы со специфичными форматами СУБД |
Помните: всегда проверяйте кодировку файлов (UTF-8 — ваш друг) и экранирование специальных символов!
Ваш следующий шаг ▶️
Попробуйте прямо сейчас:
- Экспортируйте любую таблицу в CSV через COPY
- Измените данные в текстовом редакторе
- Импортируйте обратно с добавлением нового столбца
Как говорил Данила Бежин в своих лекциях: "Настоящее понимание приходит только с практикой!"