我正在使用以下命令将放置在本地系统中的CSV文件导入到远程服务器中的表中。
但是我遇到了以下错误。
NOTICE: table "temp_table" does not exist, skipping
ERROR: could not open file "/Users/linu/downloads/numb.csv" for reading: No such file or directory
HINT: COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \copy.
CONTEXT: SQL statement "copy temp_table from '/Users/linu/downloads/numb.csv' with delimiter ';' quote '"' csv "
PL/pgSQL function staging.load_csv_file(text,text,integer) line 22 at EXECUTE
SQL state: 58P01
下面是功能的详细信息,任何人都可以帮助我找到解决方案,而无需在服务器端复制文件并建议对以下功能进行必要的更改以使其正常工作吗?
我知道该错误是因为服务器无法识别我的本地路径,已经阅读了几篇文章,但不了解如何解决它。任何提示或建议都会有很大帮助。
**Function call**
select staging.load_csv_file('numb','/Users/linu/downloads/numb.csv',73)
**Function Body**
create or replace function staging.load_csv_file
(
target_table text,
csv_path text,
col_count integer
)
returns void as $$
declare
iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet
begin
set schema 'staging';
DROP TABLE IF EXISTS temp_table;
create table temp_table ();
-- add just enough number of columns
for iter in 1..col_count
loop
execute format('alter table temp_table add column col_%s text;', iter);
end loop;
-- copy the data from csv file
execute format('copy temp_table from %L with delimiter '';'' quote ''"'' csv ', csv_path);
iter := 1;
col_first := (select col_1 from temp_table limit 1);
-- raise notice 'path', csv_path;
-- update the column names based on the first row which has the column names
for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first)
loop
execute format('alter table temp_table rename column col_%s to %s', iter, col);
iter := iter + 1;
end loop;
-- delete the columns row
execute format('delete from temp_table where %s = %L', col_first, col_first);
-- change the temp table name to the name given as parameter, if not blank
if length(target_table) > 0 then
execute format('alter table temp_table rename to %I', target_table);
end if;
end;
$$ language plpgsql;
注意:我正在使用PostgreSQL
答案 0 :(得分:0)
您无法在PostgreSQL服务器代码中执行此操作,因为数据库服务器无法访问客户端上的文件。
您必须使用支持COPY FROM STDIN
的所选语言编写客户端代码。