我试过上面的代码。我设法编译。但是,当我运行时,它给我错误:
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "\"
Position: 1
它表明我运行的查询是错误的:
字符串查询 ="\\COPY tmp from 'E:\\load.csv' delimiter ',';";
查询的 System.out.println
是:
查询字符串:\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();
最佳答案
PostgreSQL COPY
语句存在于两个变异中——服务器端 COPY
和 psql
端 \copy
。这两个语句具有相同的语法和非常相似的行为。存在显着差异 - \copy
使用客户端文件系统。 COPY
正在使用服务器端文件系统。 psql
\copy
不应作为服务器端 SQL 命令调用。它直接从 psql
或一些 bash
脚本中使用。
服务器端 COPY
用于大量导出/导入操作。当它与文件系统一起工作时,它只能由具有 super 用户权限的用户使用。非特权用户必须使用stdin
、stdout
目标,但应用程序必须支持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
的加速将是微不足道的。
关于java - PostgreSQL -\复制命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30472170/