从本地文件COPY到远程数据库

时间:2015-01-28 03:37:47

标签: postgresql sqlbulkcopy soci

有类似的问题,但他们没有解决我的问题: 我有一个在我的远程数据库中定义的存储过程。作为其操作的一部分,SP必须从本地文件批量插入(通过我在本地计算机上运行的应用程序): 程序:

CREATE OR REPLACE FUNCTION upsert_realtime(path text, traveltime_table regclass)
  RETURNS void AS
$BODY$
BEGIN   
    EXECUTE format('COPY temp_table(link_id,start_time,end_time,travel_time,interval_time, travel_mode) FROM %L DELIMITER '';'' CSV', path);
    --...     
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION upsert_realtime(text, regclass)
  OWNER TO postgres;

提供给SP的路径在本地计算机上:

select * from upsert_realtime('/home/.../travel_time.txt','realtime_travel_time');

因此我收到此错误:

terminate called after throwing an instance of 'soci::postgresql_soci_error'
  what():  Cannot execute query. ERROR:  could not open file "/home/.../travel_time.txt" for reading: No such file or directory

我唯一想到的是以某种方式自动scp将文件发送到postgresql服务器,然后运行SP,这不是最好的主意。 你能帮我找到解决方案吗?谢谢 感谢

1 个答案:

答案 0 :(得分:2)

你是using the wrong path。这是常见的错误来源。从服务器的角度来看,这都是关于"

  

带文件名的COPY指示PostgreSQL服务器直接读取   来自或写入文件。 PostgreSQL必须可以访问该文件   user(服务器运行的用户标识)和名称必须指定   从服务器的角度来看。指定PROGRAM时,   server执行给定的命令并从标准输出中读取   的程序,或写入程序的标准输入。该   必须从服务器的角度指定命令,并且   可由PostgreSQL用户执行。指定STDIN或STDOUT时   数据通过客户端和客户端之间的连接传输   服务器

如果您没有可用路径,则需要

  • 将文件移至服务器,并使用正确的路径
  • 调用可以访问本地文件的服务器上的程序
  • 使用psql连接到远程服务器并读取本地文件。
相关问题