2015-02-19 8 views
11

Ich habe den psql Postgres Terminal wurde unter Verwendung von CSV-Dateien in Tabellen mit den folgendenPostgreSQL CSV-Import von der Kommandozeile

COPY tbname FROM 
'/tmp/the_file.csv' 
delimiter '|' csv; 

der mit Ausnahme funktioniert gut zu importieren, dass ich in den psql-Terminal angemeldet sein, laufen es.

Ich mag würde wissen, ob jemand eine Möglichkeit kennt wie unten

/opt/postgresql/bin/pg_dump dbname > /tmp/dbname.sql 

einen Befehl wie dies aus der Linux-Shell-Befehlszeile ähnlich wie Postgres ermöglicht einen Shell-Befehl zu tun Dies ermöglicht die Ablagerung von eine Datenbank aus der Linux-Shell ohne am psql-Terminal angemeldet zu sein.

Antwort

17

Wie in der PostgreSQL-Dokumentation angegeben (II. PostgreSQL Client Applications - psql) Sie einen Befehl psql mit dem Schalter -c passieren kann:

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

wow danke, ich didn Denken Sie nicht einmal an die Option -c – Trent

2

Der flexibelste Weg ist zu verwenden, um eine Schale HERE document, die Sie Shell-Variablen verwenden können in Ihrer Abfrage, auch im Innern (Doppel- oder Einzelzimmer) zitiert:

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

die vorherigen answer zu vervollständigen, würde ich vorschlagen:

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

Die Lösung in der akzeptierte Antwort wird nur auf dem Server arbeiten und wenn der Benutzer die Abfrage ausgeführt wird Berechtigungen, um die Datei zu lesen, wie in this SO answer erläutert.

Andernfalls wird ein flexiblerer Ansatz ist die SQL der COPY Befehl mit den psql's "meta-command" called \copy der which takes all the same options as the "real" COPY, but is run inside the client (ohne die Notwendigkeit ; am Ende) zu ersetzen:

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

As per docs, der \copy Befehl:

Führt eine Frontend-Kopie (Client) aus. Dies ist eine Operation, die einen SQL COPY-Befehl ausführt, aber statt dass der Server die angegebene Datei liest oder schreibt, liest oder schreibt psql die Datei und leitet die Daten zwischen dem Server und dem lokalen Dateisystem weiter. Dies bedeutet, dass die Dateizugriffsmöglichkeiten und Zugriffsrechte denen des lokalen Benutzers und nicht des Servers entsprechen und keine SQL-Superuser-Berechtigungen erforderlich sind.


Darüber hinaus, wenn die the_file.csv die Header in der ersten Zeile enthält, kann es durch Zugabe von header am Ende des obigen Befehls erkannt werden:

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