PostgreSQL - \ copy命令

时间:2015-05-27 02:31:26

标签: java postgresql csv

我尝试了上面的代码。我设法编译。但是,当我跑步时,它会给我错误:

String query ="\\COPY tmp from 'E:\\load.csv' delimiter ',';";

它显示我运行的查询错误:

System.out.println

查询的query string: \COPY tmp from 'E:\load.csv' delimiter ',';为: \COPY tmp from 'E:\load.csv' delimiter ',';

我在PostgresSQL客户端运行查询:Class.forName (driver); conn = DriverManager.getConnection(host+dbname,user,password); stmt = (java.sql.Statement) conn.createStatement(); // PreparedStatement prepareUpdater = null; conn.setAutoCommit(false); String query ="\\COPY tmp from 'E:\\load.csv' delimiter ',';"; System.out.print("query string: "+query); System.out.println("Query:"+query); prepareUpdater = conn.prepareStatement(query); prepareUpdater.executeUpdate(); prepareUpdater.close(); ,它可以工作。

发生了什么事?

LEFT JOIN

4 个答案:

答案 0 :(得分:1)

PostgreSQL COPY语句存在于两个变异中 - 服务器端COPYpsql\copy。两个语句具有相同的语法和非常相似的行为。存在显着差异 - \copy正在使用客户端文件系统。 COPY正在使用服务器端文件系统。不应将psql \copy作为服务器端SQL命令调用。它直接来自psql或某些bash脚本。

服务器端COPY用于大规模导出/导入操作。当它使用文件系统时,它只能由具有超级用户权限的用户使用。非特权用户必须使用stdinstdout目标,但应用程序必须支持COPY API

psql支持它 - 所以你可以使用它将一些表从一个表复制到另一个表:

psql -c "COPY mytab TO stdout" db1 | psql -c "COPY targettab FROM stdin" db2

对于Java环境,您必须使用CopyManager之类的支持。见how to copy a data from file to PostgreSQL using JDBC?

导入COPY语句可能明显快于INSERT语句 - 但依赖于一些额外的开销 - 普通表上的差异很大,没有大量索引且没有慢速触发器。如果表上有很多索引或触发器较慢,那么COPY的加速将是边际的。

答案 1 :(得分:0)

感谢您的反馈。

我设法使用CSVReader加载* .csv。

我下载了CSVReader包并将其包含在我的代码中。

工作正常。

 CsvReader products = new CsvReader("/tmp/ip2location/IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ISP-DOMAIN-MOBILE-USAGETYPE.CSV");

             products.readHeaders();

             while (products.readRecord())
             {
                String ip_from = products.get("ip_from"); //int
                String ip_to = products.get("ip_to"); //int


                PreparedStatement prepareStat = null;

                String sqlIinsert = "insert into ip2location_tmp(ip_from, ip_to )"
        + " VALUES ("+ip_from+","+ip_to+");";

                System.out.println("sqlInsert:"+sqlIinsert);
                prepareStat = conn.prepareStatement(sqlIinsert); 
                prepareStat.executeUpdate();  

               }
        products.close();
        }enter code here

答案 2 :(得分:0)

您使用COPY代替/COPY

  

String query =“COPY tmp from'E://load.csv'delimiter','”;

它会起作用

答案 3 :(得分:-2)

COPY SQL命令从本地文件系统读取文件,服务器进程必须具有访问权限。

\copy命令是psql指令,仅在该环境中可用。您不能在SQL查询中使用它。

由于Java具有良好的CSV阅读器类,您只需在代码中读取该文件,然后使用单独的INSERT命令将数据加载到数据库中。这实际上是\copypsql工作时所做的事情。