psql - บันทึกผลลัพธ์ของคำสั่งลงในไฟล์


283

ฉันใช้ของ psql \dtเพื่อแสดงรายการตารางทั้งหมดในฐานข้อมูลและฉันต้องการบันทึกผลลัพธ์

ไวยากรณ์ในการส่งออกผลลัพธ์ของคำสั่ง psql ไปยังไฟล์คืออะไร


คำตอบ:


478

จากความช่วยเหลือของ psql ( \?):

\ o [ไฟล์] ส่งผลการสืบค้นทั้งหมดไปยังไฟล์หรือ | ไปป์

ลำดับของคำสั่งจะมีลักษณะดังนี้:

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

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

1
ฉันจะเรียกสิ่งนี้ก่อน \ dt หรือรวมกันได้อย่างไร กรุณารวมไวยากรณ์ขอบคุณ
pstanton

118
การพิมพ์\oอีกครั้งจะปิด
Carl G

3
น่าเศร้าที่ผลลัพธ์ของ\?ไม่ได้ไปที่ไฟล์ :(
blitzen9872

สำหรับการอนุญาตแบบผิดปกติของคุณถูกปฏิเสธกล่าวว่าพยายามเรียกใช้ psql ในฐานะผู้ดูแลระบบ
Ajay Takur

1
ใช่\o queries-output.txtเปลี่ยนเส้นทางคำสั่งที่ตามมาทั้งหมด o / p ไปยังไฟล์ที่ชื่อqueries-output.txtและพิมพ์\o( พร้อมท์psqlอีกครั้ง) จะเปลี่ยนพฤติกรรมการเปลี่ยนเส้นทางนี้
hygull

95

\oคำสั่งpsql ถูกอธิบายโดย jhwist แล้ว

อีกวิธีหนึ่งคือการใช้COPY TOคำสั่งเขียนโดยตรงไปยังไฟล์บนเซิร์ฟเวอร์ สิ่งนี้มีข้อได้เปรียบที่ทิ้งไว้ในรูปแบบที่ง่ายต่อการแยกวิเคราะห์ที่คุณเลือก - แทนที่จะเป็นรูปแบบตารางของ psql นอกจากนี้ยังเป็นเรื่องง่ายมากที่จะนำเข้าตารางอื่น / COPY FROMฐานข้อมูลโดยใช้

NB! นี้ต้องใช้สิทธิ์ superuser และจะเขียนไปยังแฟ้มบนเซิร์ฟเวอร์

ตัวอย่าง: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')

สร้างไฟล์ CSV ด้วย ';' เป็นตัวคั่นฟิลด์

เช่นเคยดูเอกสารประกอบสำหรับรายละเอียด


ฉันเห็นด้วย @helvete วิธีการนำเสนอที่นี่ให้พลังงานมากขึ้นสำหรับผู้ใช้ในการกำหนดค่าเอาต์พุตในแบบที่กำหนดเองมากขึ้น
Nathan Benton

27

\copyซึ่งเป็นคำสั่ง postgres สามารถทำงานกับผู้ใช้ใด ๆ ไม่ทราบว่าใช้งานได้กับ \ dt หรือไม่ แต่ไวยากรณ์ทั่วไปทำซ้ำจากลิงค์ต่อไปนี้Postgres ไวยากรณ์การคัดลอก SQL

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

ด้านบนจะบันทึกผลลัพธ์ของแบบสอบถามแบบใช้เลือกข้อมูลในชื่อไฟล์ที่ให้เป็นไฟล์ csv

แก้ไข:

สำหรับเซิร์ฟเวอร์ psql ของฉันคำสั่งต่อไปนี้ใช้งานได้นี่เป็นรุ่นที่เก่ากว่า v8.5

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

มีประโยชน์มากขอบคุณ แต่ไม่จำเป็นต้องใช้ 'คัดลอก' ใน '... คัดลอกไปที่ ... ' อันที่จริงแล้วในเวอร์ชันล่าสุดมันทำให้คำสั่งล้มเหลว
Tom

ทอมฉันคิดว่ามันเป็นคำผิด แก้ไขโพสต์ด้วยอันที่ทำงานในการติดตั้งของฉัน pgsql 8.5ver
Aakash Gupta

เพียงบันทึกย่อให้กับทุกคนที่พยายามวางในคำสั่งหลายบรรทัดหลังจาก \ copy และรับข้อผิดพลาดทางไวยากรณ์ที่สับสนอย่างที่ฉันทำ คุณต้องดำเนินการต่อในบรรทัดเดียวกับ \ copy
เกิดขึ้น

มีวิธีปิด \ copy หรือไม่ ฉันพบว่าถ้าฉันเรียกใช้คำสั่งเช่นในตัวอย่างของคุณและจากนั้นฉันเรียกใช้ตัวอย่างเช่นเลือก * จากผู้ใช้; มันจะผนวกผลลัพธ์ไปยังไฟล์ล่าสุดที่ฉันระบุแทนการส่งออกไปยังหน้าจอ ขอบคุณ.
raphael75

6

ใช้พารามิเตอร์ o ของคำสั่ง pgsql

-o, --output = FILENAME ส่งผลการสืบค้นไปยังไฟล์ (หรือ | 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; คำสั่งนี้ใช้เพื่อเก็บตารางทั้งหมดเป็น csv


ใน postgres COPY จะถูกแทนที่ด้วย \ COPY เพื่อหลีกเลี่ยงความต้องการของผู้ดูแลระบบ db ในหน้าต่างทำให้นี้ไฟล์ใน C: \ tmp
ม.ค.

3

หากคุณได้รับข้อผิดพลาดดังต่อไปนี้ 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.

คุณสามารถเรียกใช้ด้วยวิธีนี้:

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


2

ใช้แบบสอบถามด้านล่างเพื่อเก็บผลลัพธ์ในไฟล์ csv

\ copy (ข้อความค้นหาของคุณ) ไปยังส่วนหัวของ 'เส้นทางไฟล์'

ตัวอย่าง

\ คัดลอก (เลือกชื่อ, date_order จาก purchase_order) ถึง '/home/ankit/Desktop/result.csv' ส่วนหัว cvs;

หวังว่านี่จะช่วยคุณได้


1

ฉันคิดว่ามีคำสั่ง psql ภายในอยู่สำหรับเรื่องนี้ แต่คุณสามารถเรียกใช้scriptคำสั่งจากutil-linux-ng package:

DESCRIPTION Script ทำให้ typescript ของทุกสิ่งที่พิมพ์บนเทอร์มินัลของคุณ


0

วิธีการนี้จะทำงานกับคำสั่ง psql ใด ๆ จากง่ายที่สุดไปถึงซับซ้อนที่สุดโดยไม่ต้องเปลี่ยนแปลงหรือปรับเปลี่ยนคำสั่งเดิม

หมายเหตุ:สำหรับเซิร์ฟเวอร์ Linux


  • บันทึกเนื้อหาของคำสั่งของคุณลงในไฟล์

MODEL

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

HEREDOC
echo -n "$FILE_CONTENT" > sqlcmd

ตัวอย่าง

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
  • เรียกใช้คำสั่ง

MODEL

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

ตัวอย่าง

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

  • ดู / ติดตามเอาต์พุตคำสั่งของคุณ

cat sqlop

ทำ! ขอบคุณ! = D


0

วิธีการสำหรับนักเทียบท่า

ผ่านคำสั่ง psql

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

หรือแบบสอบถามจากไฟล์ sql

docker exec -i %containerid% psql -U %user% < file.sql > data.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.