Как вставить данные CSV в базу данных PostgreSQL (удаленная база данных)

У меня есть файл CSV. Я могу, используя команду ниже, вставить данные в базу данных, если файл находится на том же сервере, что и база данных:

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

Но файл находится на локальном сервере, а база данных - на другом (удаленном) сервере.

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

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

Я получаю исключение, в котором отказано в разрешении.

Как я могу вставить данные из локального файла в базу данных на удаленном сервере без привилегий суперпользователя?

2 ответа

Решение

\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

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

Когда указано 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.

Для локальной базы данных вы просто будете использовать:

COPY TABLENAME FROM 'D:\xyz.csv' DELIMITER ',' CSV HEADER

Для Сервера (удаленной базы данных) вам нужно добавить \:

\COPY TABLENAME FROM 'D:\xyz.csv' DELIMITER ',' CSV HEADER
Другие вопросы по тегам