Как вставить данные 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