SBT выбрасывает исключение JdbcSQLExceptionSyntax для запроса PostgreSQL - PullRequest
0 голосов
/ 20 декабря 2018

Я выполняю SQL-запрос, используя slick для записи в базу данных PostgreSQL.Почему я получаю синтаксическую ошибку в ошибке оператора SQL?Пожалуйста, предположите, что все конфигурации верны.

Я импортировал import slick.jdbc.PostgresProfile.api._ в клиенте и import slick.jdbc.H2Profile.api._ в построителе запросов.Я также разделил операторы postgresql и MySQL на разных компоновщиков.

import bbc.rms.client.programmes.util.MySqlStringEscaper
import org.joda.time.DateTime
import slick.jdbc.H2Profile.api._

abstract class PopularBlurProgrammesQueryBuilder extends QueryBuilder with                 
MySqlStringEscaper {

  def incrementBlurScoreQuery(pid: String, date: DateTime): DBIO[Int] = {
    sqlu"""
          INSERT INTO radio.core_entity_popularity (pid, score, date)
          VALUES($pid, 1, ${flooredSQLDateTimeString(date)}
          ) ON CONFLICT ON CONSTRAINT core_entity_popularity_pkey
          DO UPDATE
          SET score = core_entity_popularity.score + 1
    """
  }
}

`` ``

import slick.jdbc.PostgresProfile.api._

class SlickPopularBlurProgrammesClient[T](database: Database)(implicit 
executionContext: ExecutionContext)
  extends PopularBlurProgrammesQueryBuilder with 
PopularBlurProgrammesClient[T] {

override def writeBlurIncrementedScore(pid: String, date: DateTime): 
 Future[Int] = {
   database.run(incrementBlurScoreQuery(pid, date))
  }
}

Ожидаемый результат: исключение не выдается, и интеграционные тесты пройдены.Интеграционный тест:

val currentDate = dateTimeFormat.parseDateTime("2018-12-19 16:00:00")
client.writeBlurIncrementedScore("pid", currentDate)
whenReady(client.writeBlurIncrementedScore("pid", currentDate)) { 
updatedRows =>
    updatedRows must be equalTo 1
  }
}

трассировка стека:

    org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "
      INSERT INTO radio.core_entity_popularity (pid, score, date)
      VALUES(?, 1, ?
      ) ON[*] CONFLICT ON CONSTRAINT core_entity_popularity_pkey
      DO UPDATE
      SET score = core_entity_popularity.score + 1
    "; SQL statement:

      INSERT INTO radio.core_entity_popularity (pid, score, date)
      VALUES(?, 1, ?
      ) ON CONFLICT ON CONSTRAINT core_entity_popularity_pkey
      DO UPDATE
      SET score = core_entity_popularity.score + 1
 [42000-193]
org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "
      INSERT INTO radio.core_entity_popularity (pid, score, date)
      VALUES(?, 1, ?
      ) ON[*] CONFLICT ON CONSTRAINT core_entity_popularity_pkey
      DO UPDATE
      SET score = core_entity_popularity.score + 1
"; SQL statement:

      INSERT INTO radio.core_entity_popularity (pid, score, date)
      VALUES(?, 1, ?
      ) ON CONFLICT ON CONSTRAINT core_entity_popularity_pkey
      DO UPDATE
      SET score = core_entity_popularity.score + 1
 [42000-193]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.message.DbException.getSyntaxError(DbException.java:191)
at org.h2.command.Parser.getSyntaxError(Parser.java:530)
at org.h2.command.Parser.prepareCommand(Parser.java:257)
at org.h2.engine.Session.prepareLocal(Session.java:561)
at org.h2.engine.Session.prepareCommand(Session.java:502)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1203)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:73)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:287)
at slick.jdbc.JdbcBackend$SessionDef$class.prepareStatement(JdbcBackend.scala:336)
at slick.jdbc.JdbcBackend$BaseSession.prepareStatement(JdbcBackend.scala:448)
at slick.jdbc.StatementInvoker.results(StatementInvoker.scala:32)
at slick.jdbc.StatementInvoker.iteratorTo(StatementInvoker.scala:21)
at slick.jdbc.Invoker$class.first(Invoker.scala:30)
at slick.jdbc.StatementInvoker.first(StatementInvoker.scala:15)
at slick.jdbc.StreamingInvokerAction$HeadAction.run(StreamingInvokerAction.scala:52)
at slick.jdbc.StreamingInvokerAction$HeadAction.run(StreamingInvokerAction.scala:51)
at slick.basic.BasicBackend$DatabaseDef$$anon$2.liftedTree1$1(BasicBackend.scala:275)
at slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:275)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Проблема заключалась в том, что postgreSQL очень строг в выражениях и ему не нравился способ обработки даты.Он явно не знал, является ли значение даты меткой времени, поэтому мне пришлось явно вызвать функцию postgreSQL to_timestamp(text, text), а также добавить $, чтобы использовать переменные в запросе.

0 голосов
/ 22 декабря 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что вы отправляете конкретный запрос PostgreSQL в базу данных H2.

Синтаксис INSERT для PostgreSQL разрешает использование ключа ON CONFLICT

[ WITH [ RECURSIVE ] with_query [, ...] ]
INSERT INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
     { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
     [ ON CONFLICT [ conflict_target ] conflict_action ]
     [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]

where conflict_target can be one of:

     ( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
     ON CONSTRAINT constraint_name

and conflict_action is one of:

     DO NOTHING
     DO UPDATE SET { column_name = { expression | DEFAULT } |
                ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) |
                ( column_name [, ...] ) = ( sub-SELECT )
              } [, ...]
          [ WHERE condition ]

из Документы PostgreSQL

В то время как синтаксис H2 INSERT равен

INSERT INTO tableName 
{ [ ( columnName [,...] ) ] 
{ VALUES 
{ ( { DEFAULT | expression } [,...] ) } [,...] | [ DIRECT ] [ SORTED ] select } } | 
{ SET { columnName = { DEFAULT | expression } } [,...] }

из H2 DBдокументы

...