Postgresql 创建从我的计算机上的CSV文件复制到Postgres中另一台计算机上的DB的查询

Postgresql 创建从我的计算机上的CSV文件复制到Postgres中另一台计算机上的DB的查询,postgresql,csv,Postgresql,Csv,我正在尝试创建一个查询,将数据从位于我计算机上的CSV文件复制到另一台计算机上的Postgres DB 我们的Postgres数据库位于另一台计算机上,我自己负责导入和查询数据。我已使用以下方法成功地将数据从计算机上的CSV文件复制到PSQL控制台中的数据库: \COPY table_name FROM 'c:\path\to\file.csv' CSV DELIMITER E'\t' HEADER; 但是,在使用SQL编辑器编写查询时,我使用了上面相同的代码,开头没有“\”。我得到以下错误:

我正在尝试创建一个查询,将数据从位于我计算机上的CSV文件复制到另一台计算机上的Postgres DB

我们的Postgres数据库位于另一台计算机上,我自己负责导入和查询数据。我已使用以下方法成功地将数据从计算机上的CSV文件复制到PSQL控制台中的数据库:

\COPY table_name FROM 'c:\path\to\file.csv' CSV DELIMITER E'\t' HEADER;
但是,在使用SQL编辑器编写查询时,我使用了上面相同的代码,开头没有“\”。我得到以下错误:

ERROR:  could not open file "c:\pgres\dmi_vehinventory.csv" for reading: No such file or directory
********** Error **********
ERROR: could not open file "c:\pgres\dmi_vehinventory.csv" for reading: No such file or directory
SQL state: 58P01
我假设查询实际上是在DB的计算机上而不是我自己的计算机上查找文件

如何编写一个查询,告诉Postgres在我的计算机上而不是DB的计算机上查找文件


任何帮助都将不胜感激

\COPY是从本地计算机(您启动psql的计算机)上载文件的正确方法

当您要从远程目录上载到远程主机上时,复制是正确的

下面是一个示例,我已将psql连接到远程服务器:

test=# COPY test(i, i1, i3)
      FROM './test.csv' WITH DELIMITER ',';
ERROR:  could not open file "./test.csv" for reading: No such file
test=# \COPY test(i, i1, i3)
      FROM './test.csv' WITH DELIMITER ',';
test=# select * from test;
 i | i1 | i3
---+----+----
 1 |  2 |  3
(1 row)

\如果您想从本地计算机(启动psql的计算机)上载文件,复制是一种正确的方法

当您要从远程目录上载到远程主机上时,复制是正确的

下面是一个示例,我已将psql连接到远程服务器:

test=# COPY test(i, i1, i3)
      FROM './test.csv' WITH DELIMITER ',';
ERROR:  could not open file "./test.csv" for reading: No such file
test=# \COPY test(i, i1, i3)
      FROM './test.csv' WITH DELIMITER ',';
test=# select * from test;
 i | i1 | i3
---+----+----
 1 |  2 |  3
(1 row)

在处理PostgreSQL命令时,有几个常见的误解

  • 尽管psql的
    \COPY FROM'/path/to/file/on/client'
    命令与后端的
    COPY FROM'/path/to/file/on/server'
    命令具有相同的语法(反斜杠除外),但它们完全不同。当包含反斜杠时,psql实际上会将其重写为从STDIN复制的
    命令,然后读取文件本身并通过连接传输

  • 执行
    COPY FROM'file'
    命令告诉后端自己打开给定的路径并将其加载到给定的表中。因此,文件必须映射到服务器的文件系统中,并且后端进程必须具有读取该文件的正确权限。然而,这种变体的优点是,任何支持原始sql的postgresql客户机都支持它

  • 成功执行STDIN中的
    复制将连接置于特殊状态,在此期间,客户端和服务器之间使用完全不同(且更简单)的子协议,从而允许数据(可能来自或不来自文件)从客户端传输到服务器。因此,此命令在C的官方客户端库之外不受很好的支持。如果您不使用libpq,您可能无法使用此命令,但您必须进行自己的研究

  • 从STDIN复制
    /
    复制到STDOUT
    实际上与标准输入或标准输出无关;客户机需要在数据库连接上使用子协议。在
    copyin
    案例中,libpq提供了一个用于将数据发送到后端,另一个用于提交或回滚操作。在
    复制
    的情况下,libpq提供了一个函数,可以接收一行数据或数据结束标记


  • 我对SQL编辑器一无所知,但从STDIN
    命令发出的
    COPY可能会使连接处于不可用状态,尤其是通过ODBC驱动程序连接时。据我所知,PostgreSQL的ODBC驱动程序不支持
    COPY IN

    在处理PostgreSQL命令时,有几个常见的误解

  • 尽管psql的
    \COPY FROM'/path/to/file/on/client'
    命令与后端的
    COPY FROM'/path/to/file/on/server'
    命令具有相同的语法(反斜杠除外),但它们完全不同。当包含反斜杠时,psql实际上会将其重写为从STDIN复制的
    命令,然后读取文件本身并通过连接传输

  • 执行
    COPY FROM'file'
    命令告诉后端自己打开给定的路径并将其加载到给定的表中。因此,文件必须映射到服务器的文件系统中,并且后端进程必须具有读取该文件的正确权限。然而,这种变体的优点是,任何支持原始sql的postgresql客户机都支持它

  • 成功执行STDIN中的
    复制将连接置于特殊状态,在此期间,客户端和服务器之间使用完全不同(且更简单)的子协议,从而允许数据(可能来自或不来自文件)从客户端传输到服务器。因此,此命令在C的官方客户端库之外不受很好的支持。如果您不使用libpq,您可能无法使用此命令,但您必须进行自己的研究

  • 从STDIN复制
    /
    复制到STDOUT
    实际上与标准输入或标准输出无关;客户机需要在数据库连接上使用子协议。在
    copyin
    案例中,libpq提供了一个用于将数据发送到后端,另一个用于提交或回滚操作。在
    复制
    的情况下,libpq提供了一个函数,可以接收一行数据或数据结束标记


  • 我对SQL编辑器一无所知,但从STDIN
    命令发出的
    COPY可能会使连接处于不可用状态,尤其是通过ODBC驱动程序连接时。据我所知,PostgreSQL的ODBC驱动程序不支持
    COPY IN

    非常感谢,您的回答澄清了一个问题