psql - lưu kết quả của lệnh vào một tệp


Câu trả lời:


478

Từ trợ giúp của psql ( \?):

\ o [FILE] gửi tất cả kết quả truy vấn tới tệp hoặc | pipe

Chuỗi các lệnh sẽ trông như thế này:

[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal

db=>\o out.txt
db=>\dt
db=>\q

1
Tôi có gọi nó trước khi \ dt hoặc kết hợp không? vui lòng bao gồm cú pháp cảm ơn.
pstanton

118
\olại tắt nó đi.
Carl G

3
Đáng buồn thay, đầu ra của \?không đi đến tập tin. :(
blitzen9872

vì sự cho phép bất thường của bạn bị từ chối nói hãy thử chạy psql với tư cách quản trị viên
Ajay Takur

1
Có, \o queries-output.txtchuyển hướng tất cả các lệnh o / p tiếp theo thành tệp có tên queries-output.txtvà gõ \o(trên dấu nhắc psql một lần nữa) hoàn nguyên hành vi chuyển hướng này.
hygull

95

Lệnh psql \ođã được mô tả bởi jhwist.

Một cách tiếp cận khác là sử dụng COPY TOlệnh để ghi trực tiếp vào một tệp trên máy chủ. Điều này có lợi thế là nó được chuyển thành định dạng dễ phân tích theo lựa chọn của bạn - chứ không phải là định dạng được lập bảng của psql. Cũng rất dễ dàng để nhập vào bảng / cơ sở dữ liệu khác bằng cách sử dụng COPY FROM.

Lưu ý! Điều này đòi hỏi các đặc quyền siêu người dùng và sẽ ghi vào một tệp trên máy chủ .

Thí dụ: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

Tạo tệp CSV bằng ';' làm dải phân cách trường.

Như mọi khi, xem tài liệu để biết chi tiết


Tôi đồng ý @rcvete, cách tiếp cận được trình bày ở đây cung cấp nhiều năng lượng hơn cho người dùng để định cấu hình đầu ra theo cách tùy chỉnh hơn
Nathan Benton

27

\copyđó là một lệnh postgres có thể làm việc cho bất kỳ người dùng nào. Không biết nó có hoạt động cho \ dt hay không, nhưng cú pháp chung được sao chép từ liên kết sau Cú pháp sao chép SQL Postgres

\copy (select * from tempTable limit 100) to 'filenameinquotes' with header delimiter as ','

Ở trên sẽ lưu đầu ra của truy vấn chọn trong tên tệp được cung cấp dưới dạng tệp csv

BIÊN TẬP:

Đối với máy chủ psql của tôi, lệnh sau hoạt động, đây là phiên bản cũ hơn v8.5

copy (select * from table1) to 'full_path_filename' csv header;

Rất tiện dụng, cảm ơn. Nhưng 'bản sao' trong '... sao chép vào ...' không bắt buộc - thực tế trên các phiên bản gần đây, nó khiến lệnh bị lỗi.
Tom

Tom, tôi nghĩ đó là một lỗi đánh máy. Đã chỉnh sửa bài đăng với bài viết hoạt động trên cài đặt của tôi pssql 8.5ver
Aakash Gupta

Chỉ cần một ghi chú nhanh cho bất kỳ ai đang cố gắng dán vào một câu lệnh nhiều dòng sau \ copy và nhận được các lỗi cú pháp khó hiểu, như tôi vừa làm. Bạn cần tiếp tục trên cùng một dòng với \ copy.
báo cáo

Có cách nào để tắt \ copy không? Tôi thấy rằng nếu tôi chạy một câu lệnh như trong ví dụ của bạn, và sau đó tôi chạy, ví dụ, chọn * từ người dùng; rằng nó sẽ nối các kết quả vào tệp gần đây nhất mà tôi đã chỉ định thay vì xuất ra màn hình. Cảm ơn bạn.
raphael75

6

Sử dụng tham số o của lệnh pssql.

-o, --output = FILENAME gửi kết quả truy vấn đến tệp (hoặc | pipe)

psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt

3

COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER; lệnh này được sử dụng để lưu trữ toàn bộ bảng dưới dạng csv


Trong postgres, COPY được thay thế tốt hơn bằng \ COPY để tránh cần quản trị viên db. Trong cửa sổ puts này tập tin trong C: \ tmp
Jan

3

Nếu bạn gặp lỗi sau ufgtoolspg=> COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';') ; ERROR: must be superuser to COPY to or from a file HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

bạn có thể chạy nó theo cách này:

psql somepsqllink_or_credentials -c "COPY (SELECT foo, bar FROM baz) TO STDOUT (format csv, delimiter ';')" > baz.csv


2

Sử dụng truy vấn dưới đây để lưu trữ kết quả trong tệp csv

\ copy (truy vấn của bạn) vào tiêu đề csv của 'đường dẫn tệp';

Thí dụ

\ copy (chọn tên, date_order từ buy_order) vào tiêu đề '/home/ankit/Desktop/result.csv' cvs;

Hy vọng điều này sẽ giúp bạn.


1

Tôi giả sử rằng có tồn tại một số lệnh psql nội bộ cho việc này, nhưng bạn cũng có thể chạy scriptlệnh từ gói produc-linux-ng :

MÔ TẢ Script tạo một bản thảo của mọi thứ được in trên thiết bị đầu cuối của bạn.


0

Cách tiếp cận này sẽ hoạt động với bất kỳ lệnh psql nào từ đơn giản nhất đến phức tạp nhất mà không yêu cầu bất kỳ thay đổi hoặc điều chỉnh nào đối với lệnh gốc.

LƯU Ý: Đối với máy chủ Linux.


  • Lưu nội dung lệnh của bạn vào một tệp

MÔ HÌNH

read -r -d '' FILE_CONTENT << 'HEREDOC'
[COMMAND_CONTENT]

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

THÍ DỤ

read -r -d '' FILE_CONTENT << 'HEREDOC'
DO $f$
declare
    curid INT := 0;
    vdata BYTEA;
    badid VARCHAR;
    loc VARCHAR;
begin
FOR badid IN SELECT some_field FROM public.some_base LOOP
    begin
    select 'ctid - '||ctid||'pagenumber - '||(ctid::text::point) [0]::bigint
        into loc
        from public.some_base where some_field = badid;
        SELECT file||' '
        INTO vdata
        FROM public.some_base where some_field = badid;
    exception
        when others then
        raise notice 'Block/PageNumber - % ',loc;
            raise notice 'Corrupted id - % ', badid;
            --return;
    end;
end loop;
end;
$f$;

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd
  • Chạy lệnh

MÔ HÌNH

sudo -u postgres psql [some_db] -c "$(cat sqlcmd)" >>sqlop 2>&1

THÍ DỤ

sudo -u postgres psql some_db -c "$(cat sqlcmd)" >>sqlop 2>&1

  • Xem / theo dõi đầu ra lệnh của bạn

cat sqlop

Làm xong! Cảm ơn! = D


0

Cách tiếp cận cho docker

thông qua lệnh psql

 docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt

hoặc truy vấn từ tập tin sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
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.