JavaRush /Курсы /SQL SELF /Импорт данных из CSV-файлов с использованием команды `COP...

Импорт данных из CSV-файлов с использованием команды `COPY`

SQL SELF
23 уровень , 1 лекция
Открыта

Привет, друзья! Представьте, что у вас есть таблица Excel с 10 000 строк, и начальник говорит: "Загрузи-ка это в базу!" Хм...если вы попытаетесь вставлять данные вручную, то… скорее всего, вам понадобятся не только SQL-навыки, но и отпуск. 😅

К счастью, у PostgreSQL есть команда, которая работает как телепорт из CSV в базу — это COPY. Она загружает данные мгновенно, массово и без лишнего шума. Сегодня мы разберёмся, как работает COPY, как подготовить данные, и что делать, если в файле вдруг оказывается "плавающая запятая" или нестандартный символ. Поехали!

Основы команды COPY

COPY — это команда PostgreSQL, которая позволяет перемещать данные между таблицей и файловой системой. Она полезна для массовой загрузки данных в базу или для их экспорта.

Пример синтаксиса COPY для загрузки данных в таблицу:

COPY table_name FROM 'path/to/your/file.csv' DELIMITER ',' CSV HEADER;

Основные параметры:

  • FROM 'path/to/your/file.csv': определяет путь к вашему файлу CSV.
  • DELIMITER ',': указывает символ-разделитель (в данном случае это запятая).
  • CSV HEADER: указывает, что в файле CSV есть заголовок (первая строка с именами столбцов).

Команда COPY работает непосредственно на сервере, что делает её чрезвычайно быстрой при работе с большими объёмами данных.

Различие между COPY и \COPY

Иногда вы можете столкнуться с небольшой путаницей между COPY и \COPY.

  • COPY: выполняется на стороне сервера. Используется для загрузки файлов, которые находятся на сервере.
  • \COPY: клиентская команда, доступная в psql. Загрузка данных осуществляется с вашего локального компьютера.

Если вы работаете на локальной машине, скорее всего, будете использовать \COPY. Мы поговорим о ней чуть позже.

Пример использования COPY

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

Шаг 1: Подготовка таблицы

Представьте, что мы создаём таблицу для хранения информации о студентах:

CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    date_of_birth DATE,
    grade FLOAT
);

Шаг 2: Подготовка CSV-файла

Формат вашего CSV-файла должен совпадать с таблицей. Пример файла students.csv:

first_name,last_name,date_of_birth,grade
John,Doe,2001-05-15,85.5
Jane,Smith,2000-12-22,90.0
Alice,Johnson,2002-03-10,78.0
Bob,Brown,2001-08-30,NULL

Обратите внимание: порядок столбцов в CSV должен соответствовать столбцам, указанным в таблице, а типы данных должны совпадать (например, дата должна быть в формате YYYY-MM-DD).

Шаг 3: Загрузка данных

Для загрузки файла students.csv в таблицу students используйте следующую команду:

COPY students (first_name, last_name, date_of_birth, grade)
FROM '/path/to/your/students.csv'
DELIMITER ',' 
CSV HEADER;

Что здесь происходит?

  • Мы указываем имя таблицы students и столбцы, в которые загружаются данные.
  • Путь к файлу указывает на его местоположение.
  • Разделитель , указывает, что данные разделяются запятыми.
  • Параметр CSV HEADER сообщает PostgreSQL, что первая строка файла содержит названия столбцов.

Результат:

После выполнения команды данные из файла загружаются в таблицу, а вы можете сразу же проверить их:

SELECT * FROM students;

Ограничения и особенности

Чтобы избежать ошибок, убедитесь, что ваш CSV-файл соответствует следующим требованиям:

  1. Отсутствие скрытых символов или пробелов в строке заголовка.
  2. Использование правильной кодировки: в PostgreSQL обычно рекомендуется UTF-8.
  3. Совпадение разделителя и указанного параметра DELIMITER.

Типичные ошибки при загрузке COPY:

Несоответствие структуры данных. Например, если вы пытаетесь загрузить текстовое значение в числовое поле:

ERROR: invalid input syntax for type numeric: "abc"

Чтобы избежать таких проблем, убедитесь, что данные соответствуют ожидаемому типу.

Ошибка пути к файлу.

Если файл находится вне доступной директории PostgreSQL на сервере, вы получите ошибку:

ERROR: could not open file "/path/to/your/file.csv" for reading: Permission denied

Решением может быть правильная настройка прав доступа к файлу.

Как проверить, что данные загружены корректно?

После загрузки данных полезно убедиться, что всё прошло успешно. Например:

Проверка общего количества строк:

SELECT COUNT(*) FROM students;

Поиск пустых значений (например, если поле grade содержит NULL):

SELECT * FROM students WHERE grade IS NULL;

Полезные советы для работы с COPY

Логируйте ошибки. Если вы хотите записывать ошибки в отдельный файл, используйте параметр LOG ERRORS. (В PostgreSQL версии 12+).

Отключайте индексы и триггеры.

При загрузке больших объёмов данных можно временно отключить индексы:

ALTER TABLE students DISABLE TRIGGER ALL;

Используйте транзакции.

Это позволяет загрузить данные "атомарно" — либо они загрузятся полностью, либо откатятся в случае ошибки:

BEGIN;
COPY students FROM '/path/to/your/file.csv' CSV HEADER;
COMMIT;

Практическое применение

Умение пользоваться командой COPY пригодится не только администраторам баз данных — разработчикам она тоже может здорово облегчить жизнь. Представьте, что вы получаете большой объём данных из стороннего API: сначала сохраняете их в CSV-файл, а потом быстро загружаете в PostgreSQL — и можно начинать анализ. Или, скажем, коллеги просят перенести их старую базу в новую систему на PostgreSQL. В таких ситуациях COPY становится настоящей палочкой-выручалочкой.

CSV-файлы встречаются в реальных проектах постоянно. Например:

  • Вы загружаете статистику продаж в аналитическую систему.
  • Импортируете список пользователей из внешней CRM.
  • Переносите данные из Excel в PostgreSQL без лишних танцев с бубном.

На этом мы завершаем знакомство с командой COPY. В следующей лекции поговорим о том, как подготовить таблицы для загрузки данных и продумать их структуру так, чтобы всё работало быстро и надёжно. А пока не бойтесь экспериментировать — COPY открывает действительно удобные возможности для работы с большими объёмами информации.

2
Задача
SQL SELF, 23 уровень, 1 лекция
Недоступна
Импорт данных в таблицу с использованием `COPY`
Импорт данных в таблицу с использованием `COPY`
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 9
15 сентября 2025
Для решения проблемы с правами доступа: Вы можете дать права доступа на чтение на всю папку javarush для postgres: (Пример для тех, кто установил себе postgres обычным инсталлятором и потому в системе postgres находится под именем "NETWORK SERVICE") Чтобы дать доступ к CSV: Открой свойства папки с CSV → вкладка Безопасность → «Изменить» → «Добавить». В поле ввода имени пользователя введи:

NETWORK SERVICE
(обрати внимание на пробел между словами). 3. Нажми «Проверить имена» → «ОК». 4. Выдели пользователя NETWORK SERVICE → поставь галочку Чтение и выполнение или Чтение. 5. «Применить» → «ОК». Теперь PostgreSQL, работающий под «Сетевой службой», сможет читать CSV-файл. После этого используй абсолютный путь в COPY
Slevin Уровень 9
15 сентября 2025
Логируйте ошибки. Если вы хотите записывать ошибки в отдельный файл, используйте параметр LOG ERRORS. (В PostgreSQL версии 12+). Ага-ага, спасибо за разъяснения и пример, которых нет! А... Тут еще интереснее оказалось: """ В чистой PostgreSQL (в том числе 12+) нет параметра LOG ERRORS в COPY или других стандартных командах DML. То, о чём пишет лекция, скорее всего, перепутано с: Oracle SQL / SQL*Loader (LOG ERRORS там есть), SQL Server (INSERT … WITH (IGNORE_DUP_KEY = ON) или LOG ERRORS через DML), сторонними расширениями PostgreSQL (например, pg_bulkload), которые добавляют возможность логировать ошибки при загрузке CSV. В чистом PostgreSQL ошибки при COPY прерывают команду, и для логирования нужно использовать промежуточную таблицу + валидацию через INSERT … SELECT. """ --- Используйте транзакции. Это позволяет загрузить данные "атомарно" — либо они загрузятся полностью, либо откатятся в случае ошибки: """ Команда COPY сама по себе атомарна: Если используется COPY в отдельной команде, то при ошибке весь импорт откатывается автоматически. """
Евгений Уровень 49 Expert
12 августа 2025
Не обращайте внимание на ошибку в валидаторе, она выходит даже при правильном решении (путь к файлу указывайте просто products.csv). Если хотите попробовать загрузку файла в свою базу данных, то нужно немного изменить команду. Следует понимать, что команда COPY работает только с файлами, которые напрямую доступны Postgres. А какие файлы ему доступны? Файлы с того же сервера, на котором он расположен. А так как вы запустили Postgres у себя, то ваш компьютер и выступает в роли сервера. Однако, Postgres не просто должен находиться на одном сервере с файлом, но и иметь право доступа к файлу. Если вы положите ваш файл просто где-то в файловой системе, то Postgres может не иметь право доступа к нему. Однако, Postgres имеет доступ к своей собственной папке, поэтому можете положить файл туда. Например, у меня Postgres установлен вот здесь: C:\Program Files\PostgreSQL\17. Поэтому я просто положил файл в эту папку и выполнил команду:

copy products (product_name, price, quantity)
from '/Program Files/PostgreSQL/17/products.csv'
delimiter ','
CSV HEADER;
3 августа 2025
В выводе результатов выполения задания постоянно ошибка доступа к файлу. Даже при правильном решении. Очень трудно дебажить решение