CodeGym /행동 /SQL SELF /\COPY를 사용해서 내 컴퓨터에서 데이터 불러오기

\COPY를 사용해서 내 컴퓨터에서 데이터 불러오기

SQL SELF
레벨 24, 레슨 0
사용 가능

\COPY 명령어는 PostgreSQL에 데이터를 직접 내 컴퓨터에서 불러올 때 쓰는 거야. COPY는 PostgreSQL 서버에 있는 파일만 다루지만, \COPY는 내 노트북이나 데스크탑처럼 클라이언트 쪽에 있는 파일을 바로 쓸 수 있어.

\COPY는 내 컴퓨터(예: 노트북)에 있는 파일을 다룰 때 쓰는 거야. COPY는 서버에서 파일을 읽지만, \COPY는 바로 내 손에 있는 파일을 불러올 수 있지.

이건 내가 내 컴퓨터에서 프로젝트 개발하거나 테스트할 때, 혹은 PostgreSQL 서버 파일 시스템에 접근 권한이 없을 때 특히 편해. 개발자나 데이터 분석가들이 뭔가 빠르게 CSV 파일 올려서 확인할 때 자주 쓰는 방법이야. 복잡한 과정 없이 바로 쓸 수 있어서 좋아.

COPY와 \COPY의 차이점

겉보기엔 COPY랑 \COPY가 비슷해 보이지만, 실제로 동작 방식이 달라:

  • COPY는 서버 쪽에서 실행돼. 그래서 파일이 PostgreSQL이 접근할 수 있는 폴더에 있어야 하고, PostgreSQL이 그 파일을 읽을 권한도 있어야 해.

  • \COPY는 클라이언트 쪽에서 실행돼. 즉, 파일이 psql 같은 클라이언트 프로그램에서 접근 가능해야 해. \COPY를 쓰면 내 컴퓨터에 있는 파일을 서버 접근 없이 바로 불러올 수 있어.

\COPY 기본 사용법

명령어 문법

\COPY 테이블 FROM 'file_path' [WITH] (옵션)

여기서:

  • 테이블: 데이터를 불러올 테이블 이름.
  • file_path: 내 컴퓨터에 있는 파일 경로.
  • 옵션: 함수 동작을 커스터마이즈할 수 있는 선택적 파라미터.

예시:

\COPY students FROM 'C:/data/students.csv' DELIMITER ',' CSV HEADER;
  • students: 데이터를 불러올 테이블 이름.
  • 'C:/data/students.csv': 내 컴퓨터에 있는 파일 경로.
  • DELIMITER ',': 파일에서 데이터 구분자로 콤마(,)를 쓴다는 뜻.
  • CSV HEADER: 파일 첫 줄이 컬럼명(헤더)라는 뜻.

예시:

예를 들어, students.csv라는 학생 데이터 파일이 내 컴퓨터 C:/data/students.csv에 있다고 해보자. 파일 내용은 이래:

id,name,age,major
1,John Doe,20,Computer Science
2,Jane Smith,22,Mathematics
3,Emily White,21,Physics

이 데이터를 students 테이블에 넣고 싶어. 미리 PostgreSQL에 이런 구조로 테이블을 만들어놨어:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER NOT NULL,
    major TEXT
);

이제 \COPY 명령어로 데이터 불러오자:

\COPY students FROM 'C:/data/students.csv' DELIMITER ',' CSV HEADER;

이 명령어를 실행하면 students 테이블에 students.csv 파일의 세 줄이 들어가. 확인하려면 이렇게 해봐:

SELECT * FROM students;

기대 결과:

id name age major
1 John Doe 20 Computer Science
2 Jane Smith 22 Mathematics
3 Emily White 21 Physics

\COPY 명령어 옵션

\COPY를 쓸 때, 특히 CSV 포맷에서 데이터 형식이나 처리를 쉽게 해주는 주요 옵션들이 있어. 아래에 자주 쓰는 것들 정리했어.

FORMAT 옵션

데이터 포맷을 정해. 주로 text, csv를 많이 써.

예시:

\COPY users FROM 'users.csv' WITH (FORMAT csv)

왜 필요해? 이 옵션 없으면 PostgreSQL은 기본적으로 탭 구분 텍스트로 인식해. csv가 더 범용적이고 읽기 쉬워.

HEADER 옵션

CSV 파일 첫 줄이 컬럼명(헤더)라는 걸 알려줘.

예시:

\COPY users FROM 'users.csv' WITH (FORMAT csv, HEADER)

왜 필요해? 헤더 줄을 데이터로 불러오지 않게 해줘. Excel이나 다른 데서 내보낸 파일에 특히 유용해.

DELIMITER 옵션

필드 구분자를 지정해. CSV는 기본이 콤마, TEXT는 탭이야.

예시:

\COPY products FROM 'products.csv' WITH (FORMAT csv, DELIMITER ';')

왜 필요해? 유럽처럼 세미콜론(;)을 구분자로 쓰는 CSV 파일도 있어서, 이런 경우에 맞춰 쓸 수 있어.

ENCODING 옵션

파일 인코딩을 지정해.

예시:

\COPY clients FROM 'clients.csv' WITH (FORMAT csv, HEADER, ENCODING 'WIN1251')

왜 필요해? Windows나 다른 시스템 인코딩 파일도 별도 변환 없이 바로 불러올 수 있어.

NULL 옵션

파일에서 어떤 문자열을 NULL로 인식할지 정해.

예시:

\COPY orders FROM 'orders.csv' WITH (FORMAT csv, NULL 'NULL')

왜 필요해? 파일에서 값이 없을 때 'NULL'로 표시된 경우, 이걸 진짜 NULL로 불러오게 해줘.

\COPY 쓸 때 주의할 점과 특징

1. PostgreSQL 클라이언트 필요

psql은 \COPY 명령어를 지원하는 PostgreSQL 클라이언트야. 데이터베이스 작업할 때 꼭 psql을 써야 해. pgAdmin 같은 다른 클라이언트는 \COPY를 지원 안 할 수도 있어.

2. 파일 인코딩

불러올 파일 인코딩에 신경 써야 해. PostgreSQL은 기본적으로 UTF-8을 기대해. 만약 파일이 Windows-1251 같은 다른 인코딩이면 에러 날 수 있어. iconv 같은 툴이나 VS Code 같은 에디터로 인코딩 바꿔도 돼.

3. 파일 경로 표기

Windows에서는 파일 경로에 역슬래시(\)가 들어가. 이럴 땐 슬래시(/)로 바꿔줘야 해. 예를 들어 C:\data\students.csv 대신 C:/data/students.csv로 써.

자주 나오는 에러와 해결법

1. 파일 접근 에러.

이런 메시지가 나오면:

could not open file "C:/data/students.csv" for reading: No such file or directory

이걸 확인해봐:

  • 파일이 해당 경로에 진짜 있는지.
  • 절대 경로가 맞는지.
  • 파일 읽기 권한이 있는지.

2. 데이터 구조 불일치 에러. 불러오는 파일 구조가 테이블 구조랑 다르면 에러가 나. 예를 들어, 파일에 컬럼이 더 많거나 데이터 타입이 다르면 에러 메시지가 떠. 불러오기 전에 컬럼명과 타입을 꼭 확인해.

3. 인코딩 문제. 파일이 UTF-8이 아니면 글자가 깨져서 나와. 해결법은 파일을 UTF-8로 변환해서 불러오는 거야.

\COPY의 장점

1. 간편함. 명령어 한 줄로 파일에서 바로 데이터 불러올 수 있어. 서버로 파일 옮길 필요도 없어.

2. 범용성. psql은 주요 운영체제에서 다 쓸 수 있어서 \COPY도 어디서나 가능해.

3. 접근 권한 걱정 없음. 클라이언트 쪽에서 동작하니까 서버 파일 권한 신경 안 써도 돼.

제약사항과 추천

아무리 편해도 \COPY에는 몇 가지 한계가 있어:

  • 엄청 큰 파일에는 별로야. 클라이언트-서버 사이로 데이터를 전송해야 해서 느릴 수 있어. 이럴 땐 서버에서 COPY 쓰는 게 더 효율적이야.
  • 파일을 불러오기 전에 꼭 에러나 불필요한 줄, 구조 불일치가 없는지 확인해.

대용량 프로젝트라면, 먼저 작은 데이터로 테스트해보고, 문제 없으면 전체 파일을 처리하는 게 좋아.

2
과제
SQL SELF, 레벨 24, 레슨 0
잠금
NULL 값 처리와 함께 데이터 로드하기
NULL 값 처리와 함께 데이터 로드하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION