GNU/Linux >> Linux Esercitazione >  >> Linux

Importazione PostgreSQL CSV dalla riga di comando

La soluzione nella risposta accettata funzionerà solo sul server e quando l'utente che esegue la query avrà le autorizzazioni per leggere il file come spiegato in questa risposta SO.

Altrimenti, un approccio più flessibile consiste nel sostituire COPY di SQL comando con psql "meta-comando" chiamato \copy che accetta tutte le stesse opzioni della "vera" COPIA, ma viene eseguito all'interno del client (senza bisogno di ; alla fine):

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

Come da documenti, il \copy comando:

Esegue una copia frontend (client). Questa è un'operazione che esegue un comando SQL COPY, ma invece del server che legge o scrive il file specificato, psql legge o scrive il file e instrada i dati tra il server e il file system locale. Ciò significa che l'accessibilità e i privilegi dei file sono quelli dell'utente locale, non del server, e non sono richiesti privilegi di superutente SQL.

Inoltre, se the_file.csv contiene l'intestazione nella prima riga, può essere riconosciuta aggiungendo header alla fine del comando precedente:

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

Come affermato nella documentazione di PostgreSQL (II. PostgreSQL Client Applications - psql) puoi passare un comando a psql (terminale interattivo PostgreSQL) con lo switch -c . Le tue opzioni sono:

1, CSV lato client:\copy meta-comando

eseguire l'SQL COPY comando ma il file viene letto sul client e il contenuto instradato al server.

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

(opzione lato client originariamente menzionata in questa risposta)

2. CSV lato server:SQL COPY comando

legge il file sul server (l'utente corrente deve disporre dei permessi necessari):

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

i ruoli del database necessari per leggere il file sul server:

COPY la denominazione di un file o di un comando è consentita solo ai superuser del database o agli utenti a cui è concesso uno dei ruoli predefinitipg_read_server_files , pg_write_server_files , opg_execute_server_program

anche il processo del server PostgreSQL deve avere accesso al file.


Il modo più flessibile è usare una shell HERE document , che ti consente di utilizzare variabili di shell all'interno della tua query, anche tra virgolette (doppie o singole):

#!/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

Per completare la risposta precedente, suggerirei:

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

Linux
  1. Un piccolo file SSH copia la magia sulla riga di comando

  2. Eliminazione di righe specifiche da un file nella riga di comando di Linux

  3. Visualizza file tabulare come CSV dalla riga di comando

  4. Come cancellare il contenuto di un file dalla riga di comando?

  5. Come ottenere l'URL del file Dropbox dalla riga di comando?

Come estrarre o decomprimere i file tar.gz dalla riga di comando di Linux

Comando Cp in Linux (copia file)

Copia un file in più directory dalla riga di comando su Linux

Come inviare un'e-mail con allegato file dalla riga di comando

Come rimuovere le righe da un file usando il comando Sed

Come controllare l'utilizzo di Inode da cPanel e dalla riga di comando?