GNU/Linux >> Belajar Linux >  >> Linux

Impor CSV PostgreSQL dari baris perintah

Solusi dalam jawaban yang diterima hanya akan berfungsi di server dan saat pengguna menjalankan kueri akan memiliki izin untuk membaca file seperti yang dijelaskan dalam jawaban SO ini.

Jika tidak, pendekatan yang lebih fleksibel adalah mengganti COPY SQL perintah dengan psql "meta-command" yang disebut \copy yang mengambil semua opsi yang sama dengan COPY "nyata", tetapi dijalankan di dalam klien (tanpa memerlukan ; di akhir):

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"

Sesuai dokumen, \copy perintah:

Melakukan penyalinan frontend (klien). Ini adalah operasi yang menjalankan perintah SQL COPY, tetapi alih-alih server membaca atau menulis file yang ditentukan, psql membaca atau menulis file dan merutekan data antara server dan sistem file lokal. Ini berarti bahwa aksesibilitas dan hak istimewa file adalah milik pengguna lokal, bukan server, dan tidak diperlukan hak istimewa pengguna super SQL.

Selain itu, jika the_file.csv berisi header di baris pertama, dapat dikenali dengan menambahkan header di akhir perintah di atas:

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv header"

Sebagaimana dinyatakan dalam Dokumentasi PostgreSQL (II. Aplikasi Klien PostgreSQL - psql) Anda dapat meneruskan perintah ke psql (terminal interaktif PostgreSQL) dengan sakelar -c . Pilihan Anda adalah:

1, CSV sisi klien:\copy meta-perintah

melakukan SQL COPY perintah tetapi file dibaca di klien dan konten dialihkan ke server.

psql -c "\copy tbname FROM '/tmp/the_file.csv' delimiter '|' csv"

(opsi sisi klien awalnya disebutkan dalam jawaban ini)

2. CSV sisi server:SQL COPY perintah

membaca file di server (pengguna saat ini harus memiliki izin yang diperlukan):

psql -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"

peran DB yang diperlukan untuk membaca file di server:

COPY penamaan file atau perintah hanya diperbolehkan untuk pengguna super database yang diberikan salah satu peran defaultpg_read_server_files , pg_write_server_files , ataupg_execute_server_program

juga proses server PostgreSQL perlu memiliki akses ke file.


Cara yang paling fleksibel adalah dengan menggunakan shell HERE document , yang memungkinkan Anda menggunakan variabel shell di dalam kueri, bahkan di dalam tanda kutip (ganda atau tunggal):

#!/bin/sh

THE_USER=moi
THE_DB=stuff
THE_TABLE=personnel
PSQL=/opt/postgresql/bin/psql
THE_DIR=/tmp
THE_FILE=the_file.csv

${PSQL} -U ${THE_USER} ${THE_DB} <<OMG
COPY ${THE_TABLE} FROM '${THE_DIR}/${THE_FILE}' delimiter '|' csv;
OMG

Untuk melengkapi jawaban sebelumnya, saya menyarankan:

psql -d your_dbname --user=db_username -c "COPY tbname FROM '/tmp/the_file.csv' delimiter '|' csv;"

Linux
  1. Menghapus Baris Tertentu dari File di Baris Perintah Linux

  2. Lihat file tabular seperti CSV dari baris perintah

  3. Bagaimana cara mengunggah satu file dengan FTP dari baris perintah?

  1. Bagaimana saya bisa menyalin folder dari baris perintah Linux?

  2. Bagaimana cara mendapatkan URL file Dropbox dari baris perintah?

  3. Clonezilla dari Baris Perintah

  1. Cara Menghapus File dan Direktori di Linux dari Command Line

  2. Cara Memisahkan Dan Menggabungkan File Dari Baris Perintah Di Linux

  3. Sedikit keajaiban penyalinan file SSH di baris perintah