Câu trả lời:
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
\o
lại tắt nó đi.
\?
không đi đến tập tin. :(
\o queries-output.txt
chuyển hướng tất cả các lệnh o / p tiếp theo thành tệp có tên queries-output.txt
và 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.
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 TO
lệ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
\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;
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
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.
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 script
lệ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.
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.
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
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
cat sqlop
Làm xong! Cảm ơn! = D
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