ฉันใช้ของ psql \dt
เพื่อแสดงรายการตารางทั้งหมดในฐานข้อมูลและฉันต้องการบันทึกผลลัพธ์
ไวยากรณ์ในการส่งออกผลลัพธ์ของคำสั่ง psql ไปยังไฟล์คืออะไร
ฉันใช้ของ psql \dt
เพื่อแสดงรายการตารางทั้งหมดในฐานข้อมูลและฉันต้องการบันทึกผลลัพธ์
ไวยากรณ์ในการส่งออกผลลัพธ์ของคำสั่ง psql ไปยังไฟล์คืออะไร
คำตอบ:
จากความช่วยเหลือของ psql ( \?
):
\ o [ไฟล์] ส่งผลการสืบค้นทั้งหมดไปยังไฟล์หรือ | ไปป์
ลำดับของคำสั่งจะมีลักษณะดังนี้:
[wist@scifres ~]$ psql db
Welcome to psql 8.3.6, the PostgreSQL interactive terminal
db=>\o out.txt
db=>\dt
db=>\q
\o
อีกครั้งจะปิด
\?
ไม่ได้ไปที่ไฟล์ :(
\o queries-output.txt
เปลี่ยนเส้นทางคำสั่งที่ตามมาทั้งหมด o / p ไปยังไฟล์ที่ชื่อqueries-output.txt
และพิมพ์\o
( พร้อมท์psqlอีกครั้ง) จะเปลี่ยนพฤติกรรมการเปลี่ยนเส้นทางนี้
\o
คำสั่งpsql ถูกอธิบายโดย jhwist แล้ว
อีกวิธีหนึ่งคือการใช้COPY TO
คำสั่งเขียนโดยตรงไปยังไฟล์บนเซิร์ฟเวอร์ สิ่งนี้มีข้อได้เปรียบที่ทิ้งไว้ในรูปแบบที่ง่ายต่อการแยกวิเคราะห์ที่คุณเลือก - แทนที่จะเป็นรูปแบบตารางของ psql นอกจากนี้ยังเป็นเรื่องง่ายมากที่จะนำเข้าตารางอื่น / COPY FROM
ฐานข้อมูลโดยใช้
NB! นี้ต้องใช้สิทธิ์ superuser และจะเขียนไปยังแฟ้มบนเซิร์ฟเวอร์
ตัวอย่าง: COPY (SELECT foo, bar FROM baz) TO '/tmp/query.csv' (format csv, delimiter ';')
สร้างไฟล์ CSV ด้วย ';' เป็นตัวคั่นฟิลด์
\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;
ใช้พารามิเตอร์ o ของคำสั่ง pgsql
-o, --output = FILENAME ส่งผลการสืบค้นไปยังไฟล์ (หรือ | pipe)
psql -d DatabaseName -U UserName -c "SELECT * FROM TABLE" -o /root/Desktop/file.txt
COPY tablename TO '/tmp/output.csv' DELIMITER ',' CSV HEADER;
คำสั่งนี้ใช้เพื่อเก็บตารางทั้งหมดเป็น csv
หากคุณได้รับข้อผิดพลาดดังต่อไปนี้
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
ใช้แบบสอบถามด้านล่างเพื่อเก็บผลลัพธ์ในไฟล์ csv
\ copy (ข้อความค้นหาของคุณ) ไปยังส่วนหัวของ 'เส้นทางไฟล์'
ตัวอย่าง
\ คัดลอก (เลือกชื่อ, date_order จาก purchase_order) ถึง '/home/ankit/Desktop/result.csv' ส่วนหัว cvs;
หวังว่านี่จะช่วยคุณได้
ฉันคิดว่ามีคำสั่ง psql ภายในอยู่สำหรับเรื่องนี้ แต่คุณสามารถเรียกใช้script
คำสั่งจากutil-linux-ng package:
DESCRIPTION Script ทำให้ typescript ของทุกสิ่งที่พิมพ์บนเทอร์มินัลของคุณ
วิธีการนี้จะทำงานกับคำสั่ง 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
วิธีการสำหรับนักเทียบท่า
ผ่านคำสั่ง psql
docker exec -i %containerid% psql -U %user% -c '\dt' > tables.txt
หรือแบบสอบถามจากไฟล์ sql
docker exec -i %containerid% psql -U %user% < file.sql > data.txt