首页 > 解决方案 > 将 CSV 文件导入 postgres。错误:没有这样的文件或目录

问题描述

我正在尝试将 CSV 文件导入 postgresql 数据库。
首先,我尝试了以下查询:

copy temporaryData
from '/home/milad/Desktop/myFolder/csvFiles/test.csv'
delimiter ',' csv;

但它给了我以下错误:

SQL Error [42501]: ERROR: could not open file "/home/milad/Desktop/myFolder/test.csv" for reading: Permission denied

正如这个线程postgresql 教程所建议的那样,这个错误是合理的:

请注意,该文件必须由 PostgreSQL 服务器直接读取,而不是由客户端应用程序读取。因此,它必须可以被 PostgreSQL 服务器机器访问。此外,您需要具有超级用户访问权限才能成功执行 COPY 语句。

由于我不喜欢仅仅为了导入文件而更改我的系统权限,为了解决这个问题,我决定将我的 CSV 文件移动到这个答案/tmp/所建议的目录中。

然后我尝试运行以下脚本:

create or replace procedure loadInstructorOfCourses()
language plpgsql
as $$
begin 
    create table temporaryData(
        courseSectionID varchar(10),
        instructorID    varchar(25),
        courseTitle     varchar(50)
    );

    copy temporaryData
    from '/tmp/test.csv'
    delimiter ',' csv;

    drop table temporaryData;
end;$$;

call loadInstructorOfCourses();

现在它给了我以下错误:

SQL Error [58P01]: ERROR: could not open file "/tmp/test.csv" for reading: No such file or directory

但我确信该文件具有read权限others并且它也可用:

> ls -l -d /tmp
drwxrwxrwt 25 root root 700 Oct 20 09:53 /tmp
> ls -l /tmp/test.csv
-rw-r--r-- 1 milad milad 6700 Oct 20 09:53 /tmp/test.csv

为什么会发生此问题以及如何解决?

信息: 我的操作系统是 Manjaro KDE:

> uname -r
5.4.150-1-MANJARO

我还使用DBeaver连接到 postgresql 服务器并运行我的脚本。

更新:使用psql我也有同样的问题。当我通过psql连接到 db 时:

psql -U postgres -d IUTPlanning

并运行我的程序:

call loadInstructorOfCourses();

我会得到同样的错误:

ERROR:  could not open file "/tmp/test.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 temporaryData
        from '/tmp/test.csv'
        delimiter ',' csv"
PL/pgSQL function loadinstructorofcourses() line 9 at SQL statement

标签: postgresqlcsvimportfilesystemsdbeaver

解决方案


尝试使用 psql 的\copy命令,正如您引用的错误消息中的提示所暗示的那样。COPY FROM告诉服务器打开文件并处理它,同时\copy读取文件客户端然后将输出传递给服务器,请参阅https://stackoverflow.com/a/19466558/12760895

打开 psql 控制台,psql -U postgres -d [yourdb] 然后运行

\copy [target_table] from '/tmp/test.csv' DELIMITER ',' CSV;

推荐阅读