我正在try 将从一个数据库的一个表检索到的行插入到另一个数据库的相同表中.这两个数据库都是PostgreSQL.
我只想检索表中所有行的整列作为记录,并简单地将其插入到另一个数据库中的表中.
我编写了以下代码:
try {
String sourceDbUrl = "jdbc:postgresql://localhost:5432/sourcedb";
String sourceDbUsername = "postgres";
String sourceDbPassword = "admin";
Connection sourceConnection = DriverManager.getConnection(sourceDbUrl, sourceDbUsername, sourceDbPassword);
Configuration sourceConfig = new DefaultConfiguration().set(sourceConnection).set(SQLDialect.POSTGRES);
String targetDbUrl = "jdbc:postgresql://localhost:5432/targetdb";
String targetDbUsername = "postgres";
String targetDbPassword = "admin";
Connection targetConnection = DriverManager.getConnection(targetDbUrl, targetDbUsername, targetDbPassword);
Configuration targetConfig = new DefaultConfiguration().set(targetConnection).set(SQLDialect.POSTGRES);
String sourceSchema = "public";
String targetSchema = "public";
Table<Record> sourceTable = DSL.table(DSL.name(sourceSchema, "mytable"));
Table<Record> targetTable = DSL.table(DSL.name(targetSchema, "mytable"));
DSLContext sourceDslContext = DSL.using(sourceConfig);
DSLContext targetDslContext = DSL.using(targetConfig);
String customSelectQuery = "SELECT * FROM " + sourceSchema + ".mytable";
Result<Record> records = sourceDslContext.fetch(customSelectQuery);
for (Record record : records)
targetDslContext
.insertInto(targetTable)
.set(record)
.onDuplicateKeyUpdate()
.set(record)
.execute();
} catch (Exception e) {
e.printStackTrace();
}
我可以看到我成功地检索到了记录.
然而,不知何故,在由jooq inside for循环创建的upsert查询中,记录值被发送为空,我得到了以下异常:
数据访问异常:SQL[INSERT INTO"PUBLIC"."MyTABLE"VALUES()ON冲突([UNKNOWN PRIMARY KEY])DO UPDATE SET[未更新任何字段]];ERROR:语法错误在或附近")" 职位:40 在org.jooq_3.16.1.POSTGRES.DEBUG(未知源) 在org.jooq.impl.Tools.translate(Tools.java:3089) 在org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:670) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:349) 在org.jooq.impl.AbstractDelegatingQuery.execute(AbstractDelegatingQuery.java:115) 在Main.Main(Main.Java:48) 由:org.postgresql.util.PSQLException:Error:语法错误位于或附近")" 职位:40 在org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2552) 在org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2284) 在org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322) 在org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481) 在org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401) 在org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164) 在org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:153) 在org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:219) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:414) 在org.jooq.impl.AbstractDMLQuery.execute(AbstractDMLQuery.java:961) 在org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:335) ...再来两个
我感谢您的 comments .
谢谢,