【问题标题】:JDBC COPY with ant使用 ant 进行 JDBC COPY
【发布时间】:2014-04-22 21:03:14
【问题描述】:

我有一个包含 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 直接,但它通过您可以从PGConnection 获取的CopyManager API 支持。麻烦的是,你不能从一个普通的SQL 文件中使用它。就个人而言,我会向psql 运行.sql 文件。
  • 我可以使用psql,但我如何将它与 ant 一起使用?
  • Ant 支持通过 exec 任务运行 shell 命令。
  • 也许你能帮我一点忙。我做了exec 这样"&gt;&lt;exec executable="cmd"&gt; &lt;arg value="psql -p 5433 -U postgres -d etsydb -f src/main/sql/etsydbbackup.sql" /&gt; &lt;/exec&gt; 什么都没有发生..
  • 得到了答案! -

标签: java hibernate postgresql jdbc ant


【解决方案1】:

PgJDBC 不直接支持COPY,但它通过CopyManager API 支持,您可以从PgJDBC 返回的java.sql.ConnectionPGConnection 接口获取。

不幸的是,您不能在将 COPY 操作与其他命令混合的普通 SQL 文件中使用它。

就我个人而言,我会使用 Ant &lt;exec&gt; 任务向 psql 运行 .sql 文件。这样,您就可以在 SQL 文件中包含 COPY 数据内联。

启用 PgJDBC 处理COPY 会很好,但这并不容易。它实际上是 PostgreSQL 中的一种不同的协议模式,并且为它使用带有准备好的语句、执行等的常用 JDBC 接口没有多大意义。我们可以在自定义PGconnection 上提供execSQLScript,但这对您没有多大帮助,因为像Ant 的&lt;sql&gt; 任务这样的东西不会使用它。您必须编写自定义任务。

相反,PgJDBC 将不得不对客户端撒谎——当它在 COPY 命令之后进入 COPY 模式时,它必须忽略 JDBC 规范,而不是真正做它应该做的事情来响应JDBC 语句执行。这可能会破坏各种事情。

所以 - 目前,最简单的选择是执行 psql 命令来做你想做的事。

【讨论】:

  • 我不详细了解驱动程序,但我认为copy from stdin 可以通过 PreparedStatement 以“符合 JDBC”的方式集成。 copy from from stdin ? 之类的东西,? 标记数据。然后将通过PreparedStatement.setCharacterStream() 提供数据本身。在后台,驱动程序会将所有内容交给 CopyManager。
  • 非常有趣的一点。这是否适用于诸如 Ant 的 &lt;sql&gt; 任务之类的代码和其他工具,这些工具只能看到带有内联复制数据的 SQL 块,但……不确定。
  • 我同意 Ant 任务和交互式 SQL 的事情可能不会(很好)工作 - 主要是因为他们需要处理标记数据结束的(非标准)分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 2016-06-10
  • 2011-12-23
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多