Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PostgreSQL-\copy命令_Java_Postgresql_Csv - Fatal编程技术网

Java PostgreSQL-\copy命令

Java PostgreSQL-\copy命令,java,postgresql,csv,Java,Postgresql,Csv,我试过上面的代码。我设法编译。但是,当我运行时,它会给我错误: Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "\" Position: 1 这表明我运行的查询是错误的: String query=“\\COPY tmp from'E:\\load.csv'delimiter',';” 查询的System.out.println为: querystring

我试过上面的代码。我设法编译。但是,当我运行时,它会给我错误:

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "\"
Position: 1
这表明我运行的查询是错误的:

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

查询的
System.out.println
为:
querystring:\从'E:\load.csv'delimiter','复制tmp

我运行查询:
\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();
SQL命令从本地文件系统读取文件,服务器进程必须具有对该文件的访问权限

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


由于Java有一个很好的CSV阅读器类,您可以简单地读取代码中的文件,然后使用单个
INSERT
命令将数据加载到数据库中。这就是
\copy
psql

PostgreSQL
copy
语句中有效执行的操作,它存在于两种变体中-服务器端
copy
psql
\copy
。这两个语句具有相同的语法和非常相似的行为。有很大的区别-
\copy
正在使用客户端文件系统<代码>复制
正在使用服务器端文件系统
psql
\copy
不应被称为服务器端SQL命令。它直接从
psql
或一些
bash
脚本中使用

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

psql
支持它-因此您可以使用它将某些表从一个表复制到另一个表:

psql -c "COPY mytab TO stdout" db1 | psql -c "COPY targettab FROM stdin" db2
对于Java环境,您必须使用一些支持,如。看


通过
COPY
语句导入的速度可能比通过
INSERT
语句导入的速度快得多,但依赖于一些额外的开销,在没有大量索引和慢速触发器的普通表上,差异会很大。如果表中有很多索引或较慢的触发器,则从
COPY
获得的加速将是微不足道的。

感谢您的反馈

我使用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

您使用
COPY
而不是
/COPY

String query=“从'E://load.csv'delimiter','复制tmp”


它将工作

命令是COPY,没有反斜杠我需要运行的实际命令是\COPY如果我只放COPY,我可以将.csv文件加载到表中-错误必须是超级用户\COPY是psql内部命令,而不是SQL命令。只有psql理解它。单个插入将比复制慢得多。通常这取决于规模,但对于大规模进口而言,这不是一个好建议。@PavelStehule这是非常正确的,但不是问题的解决方案。我没有在OP中读到任何暗示这可能是一个巨大的csv文件的内容。我不同意“这实际上是\copy在psql中工作时所做的事情”——当然这取决于细节——但这让人困惑,因为little BitCopy还支持插入到表中。检查“文件名”中的复制表名称OP显然是关于在Windows操作系统中使用Java,因此使用
psql
stdin
stdout
的示例是不相关的。您使用
PreparedStatement
是完全错误的(而且效率低下)。在使用占位符执行while循环之前,只应准备一次。然后在循环内部使用
setString()
在调用
executeUpdate()之前提供实际值。