Giải pháp trong câu trả lời được chấp nhận sẽ chỉ hoạt động trên máy chủ và khi người dùng thực hiện truy vấn sẽ có quyền đọc tệp như được giải thích trong câu trả lời SO này.
Nếu không, một cách tiếp cận linh hoạt hơn là thay thế COPY
của SQL bằng psql
"meta-command" được gọi là \copy
có tất cả các tùy chọn giống như BẢN SAO "thực", nhưng được chạy bên trong máy khách (không cần ;
ở cuối):
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"
Theo tài liệu, \copy
lệnh:
Thực hiện sao chép giao diện người dùng (máy khách). Đây là một hoạt động chạy lệnh SQL COPY, nhưng thay vì máy chủ đọc hoặc ghi tệp được chỉ định, psql đọc hoặc ghi tệp và định tuyến dữ liệu giữa máy chủ và hệ thống tệp cục bộ. Điều này có nghĩa là khả năng truy cập tệp và đặc quyền là của người dùng cục bộ, không phải máy chủ và không cần có đặc quyền của người dùng siêu cấp SQL.
Ngoài ra, nếu the_file.csv
chứa tiêu đề ở dòng đầu tiên, nó có thể được nhận dạng bằng cách thêm header
ở cuối lệnh trên:
psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"