首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL - \copy命令

PostgreSQL - \copy命令
EN

Stack Overflow用户
提问于 2015-05-27 10:31:26
回答 4查看 4K关注 0票数 3

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

代码语言:javascript
复制
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 ',';,它可以工作。

发生了什么?

代码语言:javascript
复制
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();
EN

回答 4

Stack Overflow用户

发布于 2015-05-27 13:41:26

PostgreSQL COPY语句存在于两个变体中-服务器端COPYpsql\copy。这两个语句具有相同的语法和非常相似的行为。两者有很大的不同-- \copy使用的是客户端文件系统。COPY正在使用服务器端文件系统。不应将psql \copy调用为服务器端SQL命令。它可以直接从psql或一些bash脚本中使用。

服务端COPY用于海量导出/导入操作。当它与文件系统一起工作时,它只能由具有超级用户权限的用户使用。无权限用户必须使用stdinstdout目标,但应用程序必须支持COPY API

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

代码语言:javascript
复制
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的加速效果将微乎其微。

票数 1
EN

Stack Overflow用户

发布于 2015-05-28 14:45:27

感谢您的反馈。

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

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

它工作得很好。

代码语言:javascript
复制
 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
票数 0
EN

Stack Overflow用户

发布于 2016-05-10 19:07:48

您使用COPY而不是/COPY

String query =“从'E://load.csv‘分隔符',’”复制临时路径;

看起来不错

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30472170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档