Java 使用ant的JDBC复制
我有一个Spring、Hibernate和PostgreSQL项目,必须使用ANT创建包含数据的模式:Java 使用ant的JDBC复制,java,hibernate,postgresql,jdbc,ant,Java,Hibernate,Postgresql,Jdbc,Ant,我有一个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"
<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.
C:\Users\\\\antdb.xml:22:org.postgresql.util.PSQLException:错误:从stdin复制失败:JDBC驱动程序当前不支持复制操作。
不知道我们是否可以在这里使用postgresql.copy类 PgJDBC不支持直接
COPY
,但它通过CopyManager
API提供支持,您可以从PgJDBC返回的java.sql.Connection
接口的PGConnection
获取该API
不幸的是,您不能从普通SQL文件中使用它,在该文件中,您可以将COPY
操作与其他命令混合使用
就我个人而言,我会使用Ant
任务运行.sql
文件。这样,您就可以在SQL文件中包含COPY
数据
启用PgJDBC来处理复制
会很好,但这并不容易。在PostgreSQL中,它实际上是一种不同的协议模式,对于它来说,使用带有准备语句、执行等的普通JDBC接口没有多大意义。我们可以在定制的PGconnection
上提供一个execSQLScript
,但这对您没有多大帮助,因为像Ant的
任务这样的东西不会使用它。您必须编写一个自定义任务
相反,PgJDBC必须对客户机撒谎——当它在执行COPY
命令后进入COPY
模式时,它必须忽略JDBC规范,而不是真正执行它在响应JDBC语句时应该做的事。这可能会破坏一切
因此-目前为止,最简单的选择是只执行
psql
命令来做你想做的事。PgJDBC不支持直接COPY
,但它通过CopyManager
API来实现,你可以从PgJDBC返回的java.sql.Connection
接口获得
不幸的是,您不能从普通SQL文件中使用它,在该文件中,您可以将COPY
操作与其他命令混合使用
就我个人而言,我会使用Ant
任务运行.sql
文件。这样,您就可以在SQL文件中包含COPY
数据
启用PgJDBC来处理复制
会很好,但这并不容易。在PostgreSQL中,它实际上是一种不同的协议模式,对于它来说,使用带有准备语句、执行等的普通JDBC接口没有多大意义。我们可以在定制的PGconnection
上提供一个execSQLScript
,但这对您没有多大帮助,因为像Ant的
任务这样的东西不会使用它。您必须编写一个自定义任务
相反,PgJDBC必须对客户机撒谎——当它在执行COPY
命令后进入COPY
模式时,它必须忽略JDBC规范,而不是真正执行它在响应JDBC语句时应该做的事。这可能会破坏一切
因此,目前为止,最简单的选择是只执行
psql
命令来执行您想要的操作。PgJDBC不支持直接COPY
,但它通过CopyManager
API执行,您可以从PGConnection
获得该命令。问题是,您不能从普通的SQL
文件中使用它。就我个人而言,我会使用psql
来运行.sql
文件。我可以使用psql
但如何将其用于ant?ant支持通过exec任务运行shell命令。也许你可以帮我一点忙。但是我做了exec
像这样“>
什么也没发生..找到答案了!-PgJDBC不支持直接复制,但它通过CopyManager
API提供,您可以从PGConnection
获取该API。问题是,您不能从普通的SQL
文件中使用它。就我个人而言,我会使用psql
来运行.sql
文件。我可以使用psql
但如何将其用于ant?ant支持通过exec任务运行shell命令。也许你可以帮我一点忙。但是我做了exec
像这样“>
什么都没发生..得到了答案!-我不知道详细的驱动程序,但我认为从stdin复制的可以集成在一个“JDBC兼容”中“通过一份事先准备好的声明。类似于copy from stdin?
,其中?
标记数据。然后通过PreparedStatement.setCharacterStream()
提供数据本身。在后台,司机会把所有的东西都交给文案经理。非常有趣的一点。这是否适用于Ant的
任务和其他工具之类的代码,这些工具只会看到一个SQL块,其中包含内联的复制数据。。。不确定。我同意使用Ant任务和交互式SQL可能无法(很好地)工作-主要是因为它们需要处理标记数据结尾的(非标准)分隔符。我不知道详细的驱动程序,但我认为可以通过PreparedStatement以“JDBC兼容”的方式集成copy from stdin
。类似于copy from stdin?
,其中?
标记数据。然后通过PreparedStatement.setCharacterStream()
提供数据本身。在后台,司机会把所有的东西都交给文案经理。非常有趣的一点。这是否适用于Ant的
任务和其他工具之类的代码,这些工具只会看到一个SQL块,其中包含内联的复制数据。。。不确定。我同意Ant任务和交互式SQL可能无法正常工作——主要是因为它们需要处理标记t结束的(非标准)分隔符