Xuất bảng Postgres từ xa sang tệp CSV trên máy cục bộ


15

Tôi có quyền truy cập chỉ đọc vào cơ sở dữ liệu trên một máy chủ từ xa. Vì vậy, tôi có thể thực thi:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Nhưng trên máy chủ đó tôi không có quyền tạo / lưu tệp, vì vậy tôi cần thực hiện việc này trên máy cục bộ của mình.

Khi tôi kết nối với cơ sở dữ liệu từ xa, làm cách nào tôi có thể thực thi lệnh lưu tệp trên máy cục bộ của mình thay vì máy chủ từ xa?

Hoặc, làm cách nào tôi có thể thực thi lệnh Linux để kết nối với cơ sở dữ liệu từ xa, thực hiện truy vấn và lưu kết quả đầu ra dưới dạng tệp vào máy cục bộ của mình?

Câu trả lời:


29

Cả hai cách tiếp cận đã được đề xuất dường như phức tạp không cần thiết.

Chỉ cần sử dụng psql's built-in \copylệnh, mà hoạt động giống như server-side COPYnhưng không một bản sao thông qua giao thức dây cho khách hàng và sử dụng đường dẫn khách hàng.

Bởi vì đó là psqllệnh dấu gạch chéo ngược, bạn bỏ qua dấu chấm phẩy, ví dụ:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Xem các \copyentry trong cuốn hướng dẫn cho các psqllệnh và các COPYdocumenation lệnh để xem chi tiết hơn.

Giống như COPYbạn có thể sử dụng \copyvới một (SELECT ...)truy vấn thay vì tên bảng khi sao chép dữ liệu ra (nhưng không phải trong).


Một cách khác thường kém hơn có thể hữu ích trong một vài tình huống hạn chế là sử dụng:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

và sử dụng -ochuyển hướng đầu ra cờ hoặc vỏ để ghi đầu ra vào một tệp. Bạn hầu như luôn luôn nên sử dụng \copytheo sở thích này.


Nhưng điều này không cho phép giao dịch :(
Reza S

Ừm, chắc chắn là có. Sử dụng tài liệu ở đây để cung cấp psqltập lệnh, bắt đầu bằng BEGIN, sau đó thực hiện các \copylệnh của bạn , sau đó a COMMIT. Hoặc sử dụng psql -fđể chạy tập lệnh thay vì sử dụng tài liệu ở đây.
Craig Ringer

Cảm ơn vì đã quay trở lại ... đó là những gì tôi đã làm và nó đã hoạt động =)
Reza S

Bạn có thể sử dụng -Athay vì -P format=unalignedvà tôi cũng nghĩ rằng bạn cần một-P fieldsep=,
Evan Carroll

2

Lệnh Linux là:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
Điều đó sẽ không tạo ra CSV, nó sẽ tạo ra đầu ra văn bản có định dạng. Nếu bạn đã thêm vào -t -P format=unaligned lệnh đó, bạn sẽ nhận được một cái gì đó gần hơn một chút, như CSV được phân định bằng đường ống lỗi, nhưng các đường ống trong văn bản sẽ không được thoát nên nó không hợp lệ.
Craig Ringer

Ồ, bạn cũng muốn -P fieldsep=','ngoại trừ việc điều này thậm chí còn có khả năng gây ra lỗi do thiếu thoát. -P fieldsep_zero=onsẽ ổn nếu bạn không phiền khi phân tích văn bản được phân tách bằng byte, vì byte rỗng không thể xuất hiện một cách psqltự nhiên.
Craig Ringer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.