我有一个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 ','"
我获得了许可拒绝例外。
如何在没有超级用户权限的情况下将数据从本地文件插入远程服务器上的数据库?
答案 0 :(得分:26)
\copy
(注意反斜杠)允许您复制到远程数据库或从远程数据库复制,并且不需要超级用户权限。
psql -h remotehost -d remote_mydb -U myuser -c "\copy mytable (column1, column2) from '/path/to/local/file.csv' with delimiter as ','"
如果您正在使用Java,则可以使用JDBC驱动程序中的CopyManager:https://jdbc.postgresql.org/documentation/publicapi/org/postgresql/copy/CopyManager.html
答案 1 :(得分:15)
您可以通过STDIN提供文件。来自PostgreSQL COPY documentation ...
当指定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'
具有相同的警告。服务器执行程序,而不是客户端。
当指定PROGRAM时,服务器执行给定的命令并从程序的标准输出读取,或写入程序的标准输入。必须从服务器的角度指定该命令,并且该命令可由PostgreSQL用户执行。
答案 2 :(得分:0)
对于本地数据库,您只需使用:
COPY TABLENAME FROM 'D:\xyz.csv' DELIMITER ',' CSV HEADER
对于服务器(远程数据库),您必须添加\:
\COPY TABLENAME FROM 'D:\xyz.csv' DELIMITER ',' CSV HEADER