Uzak Postgres tablosunu yerel makinedeki CSV dosyasına aktarma


16

Uzak sunucudaki bir veritabanına salt okunur erişimim var. Böylece çalıştırabilirim:

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

Ancak bu sunucuda dosya oluşturma / kaydetme iznim yok, bu yüzden bunu yerel makinemde yapmam gerekiyor.

Uzak veritabanına bağlandığımda, dosyayı uzak sunucu yerine yerel makineme kaydetmek için nasıl komut yürütebilirim?

Veya uzak veritabanına bağlanmak, bir sorgu yürütmek ve çıktıyı yerel makineme bir dosya olarak kaydetmek için nasıl Linux komutu yürütebilirim?

Yanıtlar:


29

Daha önce önerilen her iki yaklaşım da gereksiz derecede karmaşık görünmektedir.

Sadece sunucu tarafı gibi çalışan ancak tel protokolü üzerinden bir kopyasını istemciye kopyalayan ve istemci yollarını kullanan psqlyerleşik \copykomutunu kullanın COPY.

Bir psqlters eğik çizgi komutu olduğundan , sondaki noktalı virgül kullanmayın, örneğin:

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

Bkz için manuel girişi komuta ve komuta dökümanlarını fazla ayrıntı için.\copypsqlCOPY

Tıpkı verileri dışarı kopyalarken (ancak içeri değil) tablo adı yerine bir sorgu ile COPYkullanabileceğiniz gibi .\copy(SELECT ...)


Birkaç sınırlı durumda yararlı olabilecek genellikle daha düşük bir alternatif kullanmaktır:

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

ve -oçıktıyı bir dosyaya yazmak için bayrak veya kabuk çıktı yönlendirmesini kullanın. Hemen hemen her zaman \copybunu tercih etmelisiniz .


Ancak bu işlemlere izin vermiyor :(
Reza S

Um, kesinlikle. psqlBir betiği beslemek , buradan başlamak BEGIN, sonra \copykomutlarınızı yapmak için bir burada belge kullanın, sonra a COMMIT. Veya psql -fburada bir belge kullanmak yerine bir komut dosyası çalıştırmak için kullanın .
Craig Ringer

Geri döndüğünüz için teşekkürler ... işte bunu yaptım ve işe yaradı =)
Reza S

Bunun -Ayerine kullanabilirsiniz -P format=unalignedve ayrıca bir ihtiyacınız olduğunu düşünüyorum-P fieldsep=,
Evan Carroll

2

Linux komutu:

psql -h 127.0.0.1 -U username -o file.csv -c 'select id, name from clients;'

1
CSV üretmez, biçimlendirilmiş metin çıktısı üretir. Bu -t -P format=unaligned komuta eklediyseniz , buggy boru ile sınırlandırılmış CSV gibi biraz daha yakın bir şey elde edersiniz, ancak metindeki borular kaçmayacak, bu yüzden geçersiz olacaktır.
Craig Ringer

Ayrıca -P fieldsep=',', bunun kaçma eksikliği nedeniyle hatalara neden olma ihtimalinin daha yüksek olması dışında da istersiniz . -P fieldsep_zero=onboş bayt sınırlandırılmış metni ayrıştırmayı önemsemediyseniz sorun olmaz, çünkü psqlçıktıda doğal olarak boş baytlar oluşamaz .
Craig Ringer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.