JOOQ - 更新新添加的列

JOOQ - Update newly added columns

我正在使用 JOOQ 和 Postgresql 数据库,我正在尝试向 table 添加新列,然后用值更新这些列。这些值对应于推文的情绪。

我目前的尝试(没有编译错误的那个:)是:

final String SENTIMENT_NEGATIVE = "sentiment_negative";
final String SENTIMENT_NEUTRAL  = "sentiment_neutral";
final String SENTIMENT_POSITIVE = "sentiment_positive";
final String SENTIMENT_COMPOUND = "sentiment_compound";

context.alterTable(Tweets.TWEETS).addColumnIfNotExists(SENTIMENT_NEGATIVE, DOUBLE).execute();
context.alterTable(Tweets.TWEETS).addColumnIfNotExists(SENTIMENT_NEUTRAL , DOUBLE).execute();
context.alterTable(Tweets.TWEETS).addColumnIfNotExists(SENTIMENT_POSITIVE, DOUBLE).execute();
context.alterTable(Tweets.TWEETS).addColumnIfNotExists(SENTIMENT_COMPOUND, DOUBLE).execute();

// example usage
for (Record record: tweetsResult) {
    String tweet = record.get(Tweets.TWEETS.CONTENT);
    SentimentAnalyzer sentimentAnalyzer = new SentimentAnalyzer(tweet);
    sentimentAnalyzer.analyze();
    log.debug(sentimentAnalyzer.getPolarity() + " | " + tweet);

    context.update(Tweets.TWEETS)
        .set(
            row(SENTIMENT_NEGATIVE,
               SENTIMENT_NEUTRAL,
               SENTIMENT_POSITIVE,
               SENTIMENT_COMPOUND),
            row(getPolarity(sentimentAnalyzer, SENTIMENT_NEGATIVE),
                getPolarity(sentimentAnalyzer, SENTIMENT_NEUTRAL),
                getPolarity(sentimentAnalyzer, SENTIMENT_POSITIVE),
                getPolarity(sentimentAnalyzer, SENTIMENT_COMPOUND))
            )
        .where(Tweets.TWEETS.ID.eq(record.get(Tweets.TWEETS.ID)))
        .execute();
}

但是我得到一个错误:

Exception in thread "main" org.jooq.exception.DataAccessException: SQL [update "public"."tweets" set (?, ?, ?, ?) = row (?, ?, ?, ?) where "public"."tweets"."id" = ?]; ERROR: syntax error at or near ""

我知道我可以根据数据库模式的变化重新生成我的源代码,但我想知道是否可以使用我的方法来做到这一点。

理想情况下,您将实现查询逻辑和迁移逻辑的更清晰分离。 Flyway or Liquibase 等数据库更改管理工具将帮助您维护架构,并在您的应用程序启动时应用增量。

一旦您使用了数据库更改管理软件,您也可以在开发过程中使用它,例如通过始终将增量应用于测试容器中的开发数据库,​​然后从中重新生成代码,请参阅

这样,您生成的代码始终是最新的,并且您不必求助于使用临时类型不安全的 String 最新列的表示。