Làm cách nào để xuất bảng dưới dạng CSV với các tiêu đề trên Postgresql?


418

Tôi đang cố gắng xuất bảng PostgreSQL có tiêu đề sang tệp CSV thông qua dòng lệnh, tuy nhiên tôi nhận được nó để xuất sang tệp CSV, nhưng không có tiêu đề.

Mã của tôi trông như sau:

COPY products_273 to '/tmp/products_199.csv' delimiters',';

Bạn đang sử dụng một postgres> = 8.1?
Dana the Sane

1
Tôi nghĩ rằng tôi sẽ lên kế hoạch nâng cấp lên phiên bản mới hơn, sẽ giúp cuộc sống trở nên dễ dàng hơn rất nhiều
Elitmiar

Câu trả lời:


595
COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

như được mô tả trong hướng dẫn .


7
Xin lưu ý rằng đối số HEADER không được giới thiệu cho đến 8.1.
Dana the Sane

7
Đó là, giả sử, một chút gỉ.
Milen A. Radev

65
Lưu ý COPYyêu cầu quyền quản trị viên. Sử dụng \COPYthay thế nếu bạn gặp vấn đề.
fny

5
điều này có thể cung cấp cho bạn đầu ra không phù hợp, tốt hơn là sử dụng "FORMAT csv" so với "DELIMITER ','". không chắc chắn phiên bản nào đã xuất hiện mặc dù
grahamrhay

37
Đối với v9.5, lệnh bây giờ làCOPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);
Shubham Gidel

223

Từ dòng lệnh psql:

\COPY my_table TO 'filename' CSV HEADER

không có dấu chấm phẩy ở cuối


22
phiên bản này là tốt nhất vì COPYlệnh yêu cầu quyền truy cập của quản trị viên
Matthew O'Riordan

2
Ngoài ra với psqlcách tiếp cận, người ta có thể lưu đầu ra bất cứ nơi nào người ta có quyền truy cập. Tôi chỉ sử dụng psqlcách tiếp cận để lấy dữ liệu từ một máy chủ từ xa vào một tệp cục bộ. Rất lắt léo.
Ian Gow

Tốt hơn nhiều, đặc biệt là khi lưu vào thư mục nơi bạn có quyền truy cập nhưng người dùng postgres thì không.
Steve Bennett

2
@arilwan Sử dụng pg_dump -h remote | pg_restore -h localhost.
Ian Gow

4
@arilwan psql -c "\COPY (SELECT * FROM mytable) TO STDOUT" > mytable.csv
Juha Palomäki

122

thay vì chỉ tên bảng, bạn cũng có thể viết một truy vấn để chỉ nhận dữ liệu cột được chọn.

COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

với đặc quyền quản trị viên

\COPY (select id,name from tablename) TO 'filepath/aa.csv' DELIMITER ',' CSV HEADER;

Tôi không tin rằng bạn cần dấu chấm phẩy kết thúc trong phiên bản psql của lệnh ( \COPY ...). Và ít nhất trong phiên bản psql của tôi (9.5.2), tôi không cần chỉ định 'DELIMITER'; mặc định là dấu phẩy.
dùng1071847

cú pháp thay đổi như thế nào nếu tôi sao chép từ CSV sang bảng cho các trường được chọn
user269867

99

Khi tôi không được phép viết một tập tin từ Postgres, tôi thấy rằng tôi có thể chạy truy vấn từ dòng lệnh.

psql -U user -d db_name -c "Copy (Select * From foo_table LIMIT 10) To STDOUT With CSV HEADER DELIMITER ',';" > foo_data.csv

7
Điều tốt nhất cho "mọi môi trường". Tốt nhất cho 1. Không cần quyền đặc biệt tại Postgresql hoặc tại máy khách; 2. có thể sử dụng đường dẫn tương đối; và 3. là an toàn cho định dạng CSV thực (trích dẫn an toàn).
Peter Krauss

34

Những công việc này

psql dbname -F , --no-align -c "SELECT * FROM TABLE"

10
Đẹp. Lưu ý rằng điều này dường như không thoát khỏi dấu phẩy bên trong các trường có chứa chúng.
RecursivelyIronic

Tôi thích cái này, không có -F ,, và dùng |làm dấu phân cách. Cảm ơn!
DSummersl

2
Đây không phải là những gì thường được coi là một tính năng Xuất khẩu, chỉ hiển thị dữ liệu được kiểm soát. Sự khác biệt là nhẹ, nhưng quan trọng: điều này được con người đọc nhiều hơn là COPYtuyên bố tạo ra một tệp sẽ được sử dụng lại
Romain G

7
NGUY HIỂM nó không dành cho định dạng CSV, không hoạt động cho mảng hoặc văn bản với "," .. không thực hiện trích dẫn CSV thích hợp. Sử dụng câu trả lời của @ Brian.
Peter Krauss

8

Đối với phiên bản 9.5 tôi sử dụng, nó sẽ như thế này:

COPY products_273 TO '/tmp/products_199.csv' WITH (FORMAT CSV, HEADER);

7

Giải pháp này đã làm việc cho tôi bằng cách sử dụng \copy.

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"

4

Cách đơn giản nhất (sử dụng psql) dường như là sử dụng --csvcờ:

psql --csv -c "SELECT * FROM products_273" > '/tmp/products_199.csv'

Điều đó chỉ hoạt động trong phiên bản PostgreSQL 12+
Dirk

3

Đây là cách tôi có được vỏ năng lượng hoạt động bằng cách sử dụng kết nối pgsl với cơ sở dữ liệu Heroku PG:

Trước tiên tôi phải thay đổi mã hóa máy khách thành utf8 như thế này: \encoding UTF8

Sau đó đổ dữ liệu vào tệp CSV này:

\copy (SELECT * FROM my_table) TO  C://wamp64/www/spider/chebi2/dump.csv CSV DELIMITER '~'

Tôi đã sử dụng ~ làm dấu phân cách vì tôi không thích các tệp CSV, tôi thường sử dụng các tệp TSV, nhưng nó sẽ không cho phép tôi thêm '\ t' làm dấu phân cách, vì vậy tôi đã sử dụng ~ vì nó là một characeter hiếm khi được sử dụng.


0

sao chép (anysql truy vấn datawanttoexport) vào 'fileablsoutepathwihname' delimiter ',' csv tiêu đề;

Sử dụng u này cũng có thể xuất dữ liệu.


0

Tôi đang đăng câu trả lời này vì không có câu trả lời nào khác được đưa ra ở đây thực sự hiệu quả với tôi. Tôi không thể sử dụngCOPY từ bên trong Postgres, vì tôi không có quyền chính xác. Vì vậy, tôi đã chọn "Xuất các hàng lưới" và lưu kết quả đầu ra dưới dạng UTF-8.

Các psqlphiên bản được đưa ra bởi @ Brian cũng không làm việc cho tôi, vì một lý do khác nhau. Lý do nó không hoạt động là vì rõ ràng dấu nhắc lệnh Windows (tôi đang sử dụng Windows) đã tự khắc phục xung quanh với mã hóa. Tôi liên tục nhận được lỗi này:

LRI: ký tự có chuỗi byte 0x81 trong mã hóa "WIN1252" không có tương đương trong mã hóa "UTF8"

Giải pháp tôi đã kết thúc bằng cách viết một tập lệnh JDBC ngắn (Java) đọc tệp CSV và đưa ra các câu lệnh chèn trực tiếp vào bảng Postgres của tôi. Điều này đã làm việc, nhưng dấu nhắc lệnh cũng sẽ hoạt động nếu nó không thay đổi mã hóa.


0

Hãy thử điều này: "COPY sản phẩm_273 TỪ '\ tmp \ sản phẩm_199.csv' DELIMITER ',' CSV Header"

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.