web-dev-qa-db-fra.com

Comment insérer des données CSV dans la base de données PostgreSQL (base de données distante)

J'ai un fichier CSV. Je peux, en utilisant la commande ci-dessous, insérer les données dans une base de données si le fichier se trouve sur le même serveur que la base de données:

psql -h localhost -d local_mydb -U myuser -c "copy mytable (column1, column2)  from '/path/to/local/file.csv' with delimiter as ','"

Mais le fichier se trouve sur un serveur local et la base de données se trouve sur un autre serveur (distant).

Si j'essaie de le faire pour un serveur distant, en utilisant la commande ci-dessous:

psql -h remotehost -d remote_mydb -U myuser -c "copy mytable (column1, column2)  from '/path/to/local/file.csv' with delimiter as ','"

Je reçois une exception refusée.

Comment puis-je insérer des données d'un fichier local dans une base de données sur un serveur distant, sans privilèges de superutilisateur?

18
Spike

\copy (notez la barre oblique inverse) vous permet de copier vers/depuis des bases de données distantes et ne nécessite pas de privilèges de superutilisateur.

psql -h remotehost -d remote_mydb -U myuser -c "\copy mytable (column1, column2)  from '/path/to/local/file.csv' with delimiter as ','"

Si vous utilisez Java, vous pouvez utiliser le CopyManager dans le pilote JDBC: https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html

27
Neil McGuigan

Vous pouvez alimenter le fichier via STDIN. Depuis la documentation PostgreSQL COPY ...

Lorsque STDIN ou STDOUT est spécifié, les données sont transmises via la connexion entre le client et le serveur.

psql -h remotehost -d remote_mydb -U myuser -c \
    "copy mytable (column1, column2) from STDIN with delimiter as ','" \
    < /path/to/local/file.csv

J'avais tort d'utiliser FROM PROGRAM. Il a les mêmes mises en garde que FROM 'filename'. Le serveur exécute le programme, pas le client.

Lorsque PROGRAM est spécifié, le serveur exécute la commande donnée et lit à partir de la sortie standard du programme, ou écrit sur l'entrée standard du programme. La commande doit être spécifiée du point de vue du serveur et être exécutable par l'utilisateur PostgreSQL.

16
Schwern