Ekspor tabel Postgres jarak jauh ke file CSV di mesin lokal

15

Saya memiliki akses hanya baca ke database di server jauh. Jadi, saya bisa menjalankan:

COPY products TO '/tmp/products.csv' DELIMITER ',';

Tetapi pada server itu saya tidak memiliki izin untuk membuat / menyimpan file, jadi saya perlu melakukan ini pada mesin lokal saya.

Ketika saya terhubung ke basis data jauh, bagaimana saya bisa menjalankan perintah untuk menyimpan file di mesin lokal saya alih-alih server jauh?

Atau, bagaimana saya bisa menjalankan perintah Linux untuk terhubung ke basis data jauh, menjalankan kueri, dan menyimpan output sebagai file ke mesin lokal saya?

tasmaniski
sumber

Jawaban:

29

Kedua pendekatan yang sudah disarankan tampaknya tidak perlu rumit.

Cukup gunakan psql's built-in \copyperintah, yang bekerja seperti server-side COPYtetapi tidak salinan atas protokol kawat untuk klien dan menggunakan jalur klien.

Karena itu psqlperintah backslash Anda menghilangkan tanda titik koma, misalnya:

\copy products TO '/tmp/products.csv' CSV DELIMITER ','

Lihat yang \copymasuk dalam manual untuk psqlperintah dan COPYperintah documenation untuk lebih detail.

Sama seperti COPYAnda dapat menggunakan \copydengan (SELECT ...)permintaan bukannya nama tabel saat menyalin data keluar (tapi tidak di).


Alternatif yang umumnya lebih rendah yang dapat berguna dalam beberapa situasi terbatas adalah dengan menggunakan:

psql -t -P format=unaligned -P fieldsep_zero=on -c 'SELECT * FROM tablename'

dan gunakan -opengalihan output flag atau shell untuk menulis output ke file. Anda harus selalu menggunakan \copypreferensi ini.

Craig Ringer
sumber
Tapi ini tidak memungkinkan untuk transaksi :(
Reza S
Um, tentu saja. Gunakan dokumen di sini untuk memberi makan psqlskrip, mulai dengan BEGIN, kemudian melakukan \copyperintah Anda , lalu a COMMIT. Atau gunakan psql -funtuk menjalankan skrip daripada menggunakan dokumen di sini.
Craig Ringer
Terima kasih telah kembali ... itulah yang akhirnya saya lakukan dan berhasil =)
Reza S
Anda dapat menggunakan -Abukan -P format=unaligneddan juga saya pikir Anda perlu-P fieldsep=,
Evan Carroll
2

Perintah Linux adalah:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'
tasmaniski
sumber
1
Itu tidak akan menghasilkan CSV, itu akan menghasilkan output teks yang diformat. Jika Anda menambahkan -t -P format=unaligned ke perintah itu, Anda akan mendapatkan sesuatu yang sedikit lebih dekat, seperti CSV yang dibatasi oleh kereta, tetapi pipa dalam teks tidak akan lolos sehingga tidak valid.
Craig Ringer
Oh, Anda juga ingin -P fieldsep=','kecuali bahwa ini akan lebih mungkin menyebabkan kesalahan karena kurang melarikan diri. -P fieldsep_zero=onakan baik-baik saja jika Anda tidak keberatan mem-parsing teks null-byte-delimited, karena null byte tidak dapat terjadi dalam psqloutput secara alami.
Craig Ringer