Содержимое базы данных H2 не сохраняется при вставке и обновлении - PullRequest
0 голосов
/ 06 апреля 2020

Я использую базу данных h2 для проверки моей postgres гладкой функциональности.

Я создал следующий h2DbComponent:


    trait H2DBComponent extends DbComponent {

      val driver = slick.jdbc.H2Profile
      import driver.api._
      val h2Url = "jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;INIT=runscript from './test/resources/schema.sql'\\;runscript from './test/resources/schemadata.sql'"

      val logger = LoggerFactory.getLogger(this.getClass)

      val db: Database = {
        logger.info("Creating test connection ..................................")
        Database.forURL(url = h2Url, driver = "org.h2.Driver")
      }
    }

В приведенном выше фрагменте я создаю свои таблицы с использованием схемы. sql и вставляю одну строку (запись) со схемаданными. sql .

Затем я пытаюсь вставить запись в таблицу, как показано ниже, используя мой тестовый пример:


    class RequestRepoTest extends FunSuite with RequestRepo with H2DBComponent {

      test("Add new Request") {
        val response = insertRequest(Request("XYZ","tk", "DM", "RUNNING", "0.1", "l1", "file1",
          Timestamp.valueOf("2016-06-22 19:10:25"), Some(Timestamp.valueOf("2016-06-22 19:10:25")), Some("scienceType")))
        val actualResult=Await.result(response,10 seconds)
        assert(actualResult===1)

        val response2 = getAllRequest()
        assert(Await.result(response2, 5 seconds).size === 2)
      }
    }

Приведенное выше утверждение о вставке отлично работает, утверждая, что запись вставлена. Но завершение getAllRequest () завершается ошибкой, поскольку выходные данные по-прежнему содержат одну строку (как вставлено schemadata. sql) =>, что означает, что изменение insertRequest не сохраняется. Однако в приведенных ниже инструкциях говорится, что запись вставлена, поскольку вставка вернула 1, указав одну вставленную запись.


    val response = insertRequest(Request("CMP_XYZ","tesco_uk", "DM", "RUNNING", "0.1", "l1", "file1",
        Timestamp.valueOf("2016-06-22 19:10:25"), Some(Timestamp.valueOf("2016-06-22 19:10:25")), 
        Some("scienceType")))
    val actualResult=Await.result(response,10 seconds)

Ниже приведено мое определение insertRequest:


    def insertRequest(request: Request):Future[Int]= {
        db.run { requestTableQuery += request }
    }

Я не могу определить Как я могу увидеть вставленную запись. Есть ли свойство / конфиг, который мне нужно добавить?

1 Ответ

1 голос
/ 06 апреля 2020

Но завершение getAllRequest () завершается неудачно, так как вывод по-прежнему содержит одну строку (как вставлено schemadata. sql) =>, что означает, что изменение insertRequest не сохраняется

Я бы дважды проверил, что строка assert(Await.result(response2, 5 seconds).size === 2) не работает из-за разницы в размерах. Может ли это произойти из-за какого-то другого общего сбоя?

Например, поскольку INIT запускается для каждого соединения, возможно, вы заново создаете базу данных для каждого соединения. Если вы не будете осторожны с SQL, это может привести к ошибке, такой как «таблица уже существует». Добавление TRACE_LEVEL_SYSTEM_OUT=2; к вашему URL-адресу H2 может быть полезно для отслеживания того, что делает H2.

Несколько предложений.

Во-первых, вы можете убедиться, что ваш SQL работает только при необходимости. Например, ваш schema.sql может добавить проверки, чтобы избежать попытки создания таблицы дважды:

CREATE TABLE IF NOT EXISTS my_table( my_column VARCHAR NULL );

И аналогично для вашего schemadata.sql:

MERGE INTO my_table KEY(my_column) VALUES ('a') ;

В качестве альтернативы вы можете установить sh схема и тестовые данные вокруг ваших тестов (например, возможно, в коде Scala, используя Slick). Ваш тестовый фреймворк, вероятно, может обеспечить выполнение чего-либо до и после теста или тестового набора.

...