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