Lệnh \COPY được dùng để tải dữ liệu vào PostgreSQL trực tiếp từ máy tính cá nhân của bạn. Khác với COPY (làm việc với file trên server PostgreSQL), \COPY thao tác với file có sẵn ở phía client, ví dụ như trên laptop hoặc máy bàn của bạn.
Lệnh \COPY dùng khi bạn thao tác với file trên máy tính cá nhân, ví dụ laptop. Khác với COPY (đọc file từ server), \COPY cho phép bạn tải dữ liệu ngay từ máy của mình.
Cách này cực tiện khi bạn đang phát triển hoặc test project trên máy cá nhân, hoặc khi bạn không có quyền truy cập vào hệ thống file của server PostgreSQL. Cách tiếp cận này rất phổ biến với dev và analyst, những người cần import nhanh file CSV để kiểm tra gì đó mà không phải lằng nhằng.
Khác biệt giữa COPY và \COPY
Nhìn sơ qua thì COPY và \COPY khá giống nhau, nhưng cách hoạt động lại khác biệt:
COPYchạy ở phía server và yêu cầu file phải nằm trong thư mục mà PostgreSQL truy cập được. PostgreSQL cần có quyền đọc file đó.\COPYchạy ở phía client, tức là file phải có sẵn cho app client, ví dụpsql. Dùng\COPY, bạn có thể tải dữ liệu từ file trên máy mình, kể cả khi không truy cập được server.
Cơ bản về cách dùng \COPY
Cú pháp lệnh
\COPY bảng FROM 'file_path' [WITH] (tùy_chọn)
Trong đó:
bảng: tên bảng bạn muốn import dữ liệu vào.file_path: đường dẫn đến file trên máy tính của bạn.tùy_chọn: các tham số không bắt buộc, giúp bạn tùy chỉnh hành vi của lệnh.
Ví dụ:
\COPY students FROM 'C:/data/students.csv' DELIMITER ',' CSV HEADER;
students: tên bảng bạn muốn import dữ liệu vào.'C:/data/students.csv': đường dẫn file trên máy tính của bạn.DELIMITER ',': chỉ định ký tự phân tách dữ liệu trong file (ở đây là dấu phẩy).CSV HEADER: báo rằng dòng đầu tiên của file là tiêu đề cột.
Ví dụ:
Giả sử bạn có file students.csv chứa dữ liệu sinh viên, nằm ở thư mục trên máy bạn, ví dụ C:/data/students.csv. Nội dung file như sau:
id,name,age,major
1,John Doe,20,Computer Science
2,Jane Smith,22,Mathematics
3,Emily White,21,Physics
Bạn muốn import dữ liệu này vào bảng students. Trước đó, mình đã tạo bảng trong PostgreSQL với cấu trúc như sau:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL,
major TEXT
);
Bây giờ dùng lệnh \COPY để import dữ liệu:
\COPY students FROM 'C:/data/students.csv' DELIMITER ',' CSV HEADER;
Sau khi chạy lệnh này, bảng students sẽ có ba dòng dữ liệu từ file students.csv. Bạn có thể kiểm tra như sau:
SELECT * FROM students;
Kết quả mong đợi:
| id | name | age | major |
|---|---|---|---|
| 1 | John Doe | 20 | Computer Science |
| 2 | Jane Smith | 22 | Mathematics |
| 3 | Emily White | 21 | Physics |
Tham số của lệnh \COPY
Khi dùng \COPY, nhất là với định dạng CSV, bạn nên biết các tham số quan trọng giúp kiểm soát format dữ liệu và dễ xử lý hơn. Dưới đây là những tham số phổ biến nhất.
Tham số FORMAT
Xác định định dạng dữ liệu. Thường dùng nhất là: text, csv.
Ví dụ:
\COPY users FROM 'users.csv' WITH (FORMAT csv)
Tại sao cần: nếu không có tham số này, PostgreSQL sẽ nghĩ bạn dùng định dạng text với tab. csv thì phổ biến và dễ đọc hơn nhiều.
Tham số HEADER
Báo rằng dòng đầu tiên của file CSV là tiêu đề cột, không phải dữ liệu.
Ví dụ:
\COPY users FROM 'users.csv' WITH (FORMAT csv, HEADER)
Tại sao cần: giúp bỏ qua dòng tiêu đề khi import — rất tiện khi export từ Excel hoặc hệ thống khác.
Tham số DELIMITER
Chỉ định ký tự phân tách trường. Mặc định là dấu phẩy cho CSV, tab cho TEXT.
Ví dụ:
\COPY products FROM 'products.csv' WITH (FORMAT csv, DELIMITER ';')
Tại sao cần: giúp import/export với các định dạng CSV lạ, ví dụ dùng dấu chấm phẩy (rất hay gặp ở châu Âu).
Tham số ENCODING
Chỉ định encoding của file.
Ví dụ:
\COPY clients FROM 'clients.csv' WITH (FORMAT csv, HEADER, ENCODING 'WIN1251')
Tại sao cần: giúp import file có encoding Windows hoặc hệ khác mà không phải convert thủ công.
Tham số NULL
Xác định giá trị chuỗi nào trong file sẽ được coi là NULL.
Ví dụ:
\COPY orders FROM 'orders.csv' WITH (FORMAT csv, NULL 'NULL')
Tại sao cần: khi đọc file mà giá trị thiếu được ghi là 'NULL', tham số này giúp hiểu đúng các trường rỗng.
Giới hạn và lưu ý khi dùng \COPY
1. Yêu cầu về client PostgreSQL
psql là client PostgreSQL hỗ trợ lệnh \COPY. Hãy chắc chắn bạn dùng đúng client này để làm việc với database. Lưu ý các client khác như pgAdmin có thể không hỗ trợ \COPY.
2. Encoding của file
Chú ý encoding của file bạn import. PostgreSQL mong đợi file ở UTF-8. Nếu file có encoding khác (ví dụ Windows-1251), có thể sẽ lỗi. Bạn có thể convert encoding bằng tool như iconv hoặc editor (như VS Code).
3. Đường dẫn file
Trên Windows, đường dẫn file có thể dùng dấu gạch ngược (\). Hãy thay bằng dấu gạch chéo (/). Ví dụ, thay vì C:\data\students.csv hãy dùng C:/data/students.csv.
Lỗi thường gặp và cách xử lý
1. Lỗi không truy cập được file.
Nếu bạn thấy kiểu lỗi như sau:
could not open file "C:/data/students.csv" for reading: No such file or directory
Hãy kiểm tra:
- File có tồn tại ở đường dẫn đó không.
- Bạn đã nhập đúng đường dẫn tuyệt đối chưa.
- Bạn có quyền truy cập file không.
2. Lỗi không khớp cấu trúc dữ liệu. Nếu cấu trúc file khác với bảng, bạn sẽ bị lỗi. Ví dụ file có thêm cột hoặc kiểu dữ liệu sai, sẽ báo lỗi. Hãy kiểm tra tiêu đề cột và kiểu dữ liệu trước khi import.
3. Lỗi encoding. Nếu file không phải UTF-8, bạn sẽ thấy ký tự "lạ" thay vì text. Cách xử lý — convert file sang UTF-8 trước khi import.
Ưu điểm khi dùng \COPY
1. Dễ dùng. Bạn chỉ cần một lệnh là import xong dữ liệu từ file. Không cần copy file lên server.
2. Đa năng. psql chạy được trên mọi hệ điều hành lớn, nên \COPY dùng được ở bất cứ đâu.
3. Không lo quyền truy cập. Vì lệnh chạy ở phía client, bạn không phải lo về quyền truy cập file trên server.
Giới hạn và khuyến nghị
Dù tiện, lệnh \COPY cũng có vài giới hạn:
- Không phù hợp với file quá lớn, vì phải truyền dữ liệu qua mạng giữa client và server. Trường hợp này nên dùng
COPYtrên server cho hiệu quả. - Hãy chắc file của bạn đã chuẩn bị kỹ: sửa lỗi, xóa dòng thừa, cấu trúc file khớp với bảng.
Với project lớn, nên test import với file nhỏ trước rồi mới xử lý file đầy đủ.
GO TO FULL VERSION