我有一个包含Spring,Hibernate和PostgreSQL的项目,并且必须使用ANT创建包含数据的模式:
<sql driver="org.postgresql.Driver"
classpath="src/main/webapp/WEB-INF/lib/postgresql-9.1-901.jdbc4.jar"
url="jdbc:postgresql://localhost:5433/postgres"
userid="postgres"
password="pw123"
autocommit="true"
src="src/main/sql/dbbackup.sql">
</sql>
但我收到此错误:
C:Users<user><workspace><Project>antdb.xml:22: org.postgresql.util.PSQLException: ERROR: COPY from stdin failed: The JDBC driver currently does not support COPY operations.
不知道我们是否可以以某种方式在这里使用 postgresql.copy 类?
PgJDBC 不支持直接COPY
,但它可以通过 CopyManager
API 从 PgJDBC 返回的java.sql.Connection
的PGConnection
接口获得。
不幸的是,您不能从普通 SQL 文件中使用它,在该文件中COPY
操作与其他命令混合在一起。
就个人而言,我会花钱给psql
使用 Ant <exec>
任务运行.sql
文件。这样,您就可以在 SQL 文件中内联包含COPY
数据。
让 PgJDBC 处理COPY
会很好,但这并不容易。它实际上是PostgreSQL中一种不同的协议模式,并且将通常的JDBC接口与预准备语句一起使用,执行等没有多大意义。我们可以提供有关自定义PGconnection
的execSQLScript
,但这对您没有多大帮助,因为像 Ant 的 <sql>
任务这样的东西不会使用它。您必须编写自定义任务。
相反,PgJDBC 将不得不对客户端撒谎 - 当它在COPY
命令后进入COPY
模式时,它必须忽略 JDBC 规范,而不是真正执行它应该响应 JDBC 语句执行的操作。这可能会破坏各种事情。
所以 - 就目前而言,到目前为止,最简单的选择是执行 psql
命令来执行您想要的操作。