我尝试了上面的代码。我设法编译。但是,当我运行时,它会给我错误:
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是:query string: \COPY tmp from 'E:\load.csv' delimiter ',';
我在PostgresSQL客户机中运行查询:\COPY tmp from 'E:\load.csv' delimiter ',';,它可以工作。
发生了什么?
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();发布于 2015-05-27 13:41:26
PostgreSQL COPY语句存在于两个变体中-服务器端COPY和psql端\copy。这两个语句具有相同的语法和非常相似的行为。两者有很大的不同-- \copy使用的是客户端文件系统。COPY正在使用服务器端文件系统。不应将psql \copy调用为服务器端SQL命令。它可以直接从psql或一些bash脚本中使用。
服务端COPY用于海量导出/导入操作。当它与文件系统一起工作时,它只能由具有超级用户权限的用户使用。无权限用户必须使用stdin、stdout目标,但应用程序必须支持COPY API。
psql支持它-所以您可以使用它将一些表从一个表复制到另一个表:
psql -c "COPY mytab TO stdout" db1 | psql -c "COPY targettab FROM stdin" db2对于Java Environment,您必须使用一些支持,如CopyManager。请参阅how to copy a data from file to PostgreSQL using JDBC?
通过COPY语句导入可能比通过INSERT语句导入要快得多-但依赖于一些额外的开销-在没有大量索引和没有慢速触发器的普通表上,差异会很大。如果您在表上有很多索引或较慢的触发器,那么COPY的加速效果将微乎其微。
发布于 2015-05-28 14:45:27
感谢您的反馈。
我设法用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发布于 2016-05-10 19:07:48
您使用COPY而不是/COPY
String query =“从'E://load.csv‘分隔符',’”复制临时路径;
看起来不错
https://stackoverflow.com/questions/30472170
复制相似问题