PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lưu đầu ra PL / pgSQL từ PostgreSQL vào tệp CSV

Bạn muốn tệp kết quả trên máy chủ hay trên máy khách?

Phía máy chủ

Nếu bạn muốn thứ gì đó dễ sử dụng lại hoặc tự động hóa, bạn có thể sử dụng lệnh COPY được tích hợp sẵn của Postgresql. ví dụ:

Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;

Phương pháp này chạy hoàn toàn trên máy chủ từ xa - nó không thể ghi vào PC cục bộ của bạn. Nó cũng cần được chạy như một "superuser" của Postgres (thường được gọi là "root") vì Postgres không thể ngăn nó làm những việc xấu với hệ thống tệp cục bộ của máy đó.

Điều đó không thực sự có nghĩa là bạn phải được kết nối với tư cách là một siêu người dùng (tự động hóa sẽ là một rủi ro bảo mật thuộc một loại khác), bởi vì bạn có thể sử dụng SECURITY DEFINER tùy chọn để CREATE FUNCTION để tạo một hàm chạy như thể bạn là siêu người dùng .

Phần quan trọng là chức năng của bạn ở đó để thực hiện các kiểm tra bổ sung, không chỉ vượt qua bảo mật - vì vậy bạn có thể viết một hàm xuất dữ liệu chính xác mà bạn cần hoặc bạn có thể viết một cái gì đó có thể chấp nhận các tùy chọn khác nhau miễn là chúng đáp ứng một danh sách trắng nghiêm ngặt. Bạn cần kiểm tra hai điều:

  1. Tệp nào người dùng có nên được phép đọc / ghi trên đĩa không? Ví dụ:đây có thể là một thư mục cụ thể và tên tệp có thể phải có tiền tố hoặc phần mở rộng phù hợp.
  2. bảng nào người dùng có thể đọc / ghi trong cơ sở dữ liệu không? Điều này thường được xác định bởi GRANT s trong cơ sở dữ liệu, nhưng chức năng hiện đang chạy dưới dạng siêu người dùng, vì vậy các bảng thường nằm "ngoài giới hạn" sẽ hoàn toàn có thể truy cập được. Có thể bạn không muốn để ai đó gọi hàm của mình và thêm hàng vào cuối bảng “người dùng”…

Tôi đã viết một bài đăng trên blog mở rộng về phương pháp này, bao gồm một số ví dụ về các hàm xuất (hoặc nhập) các tệp và bảng đáp ứng các điều kiện nghiêm ngặt.

Phía khách hàng

Cách tiếp cận khác là thực hiện xử lý tệp ở phía máy khách , tức là trong ứng dụng hoặc tập lệnh của bạn. Máy chủ Postgres không cần biết tệp bạn đang sao chép vào, nó chỉ lấy ra dữ liệu và máy khách đặt nó ở đâu đó.

Cú pháp cơ bản cho điều này là COPY TO STDOUT lệnh và các công cụ đồ họa như pgAdmin sẽ gói nó cho bạn trong một hộp thoại đẹp.

psql ứng dụng dòng lệnh có một "meta-command" đặc biệt được gọi là \copy , có tất cả các tùy chọn giống như COPY "thực" , nhưng được chạy bên trong máy khách:

\copy (Select * From foo) To '/tmp/test.csv' With CSV

Lưu ý rằng không có kết thúc ; , bởi vì các lệnh meta được kết thúc bằng dòng mới, không giống như các lệnh SQL.

Từ tài liệu:

Đừng nhầm lẫn COPY với lệnh psql \ copy. \ copy gọi SAO CHÉP TỪ STDIN hoặc SAO CHÉP ĐẾN STDOUT, sau đó tìm nạp / lưu trữ dữ liệu trong một tệp mà máy khách psql có thể truy cập được. Do đó, khả năng truy cập tệp và quyền truy cập phụ thuộc vào máy khách hơn là máy chủ khi \ copy được sử dụng.

Ngôn ngữ lập trình ứng dụng của bạn có thể cũng có hỗ trợ đẩy hoặc tìm nạp dữ liệu, nhưng nói chung bạn không thể sử dụng COPY FROM STDIN / TO STDOUT trong một câu lệnh SQL tiêu chuẩn, bởi vì không có cách nào để kết nối luồng đầu vào / đầu ra. Trình xử lý PostgreSQL của PHP ( không PDO) bao gồm pg_copy_from rất cơ bản và pg_copy_to các hàm sao chép vào / từ một mảng PHP, có thể không hiệu quả đối với các tập dữ liệu lớn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giải thích lệnh PostgreSQL VALUES

  2. Bản ghi dựa trên con trỏ trong PostgreSQL

  3. Thêm các Truy vấn PostgreSQL Yêu thích của Tôi - và Tại sao Chúng Cũng Quan trọng

  4. Lưu đầu ra từ hàm sql vào tệp csv (COPY) với tên tệp động

  5. Postgresql:Kết nối bị từ chối. Kiểm tra xem tên máy chủ và cổng có chính xác không và người quản lý bưu điện có chấp nhận kết nối TCP / IP không