Как вставить данные csv в postgresql db (удаленный db)

У меня есть файл csv.

Я мог бы вставить данные, если файл и db доступны на том же сервере, используя следующую команду.

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

Но файл находится на локальном сервере, но db доступен на другом сервере (удаленном)

Если я попытаюсь сделать для удаленного сервера, используя следующую команду

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

Исключение исключений для разрешения на доступ.

Как я могу это сделать?

Ответ 1

\copy (обратите внимание на обратную косую черту) позволяет копировать в/из удаленных баз данных и не требует привилегий суперпользователя.

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

Если вы используете Java, вы можете использовать CopyManager в драйвере JDBC: https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html

Ответ 2

Вы можете подать файл через STDIN. Из Документация PostgreSQL COPY...

Когда указывается STDIN или STDOUT, данные передаются через соединение между клиентом и сервером.

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

Я неправильно использовал FROM PROGRAM. Он имеет те же оговорки, что и FROM 'filename'. Сервер выполняет программу, а не клиент.

Когда задана ПРОГРАММА, сервер выполняет данную команду и считывает со стандартного вывода программы или записывает на стандартный ввод программы. Команда должна быть указана с точки зрения сервера и должна быть выполнена пользователем PostgreSQL.