使用H2数据库在游戏中运行测试时,未知数据类型为“JSONB”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用H2数据库在游戏中运行测试时,未知数据类型为“JSONB”相关的知识,希望对你有一定的参考价值。

我有进化问题未知数据类型:“JSONB”在play框架中运行测试时使用

  • 用于scala的playframework v2.6.6
  • play-slick v3.0.2
  • play-slick-evolutions v3.0.2
  • postgresql - 42.0.0
  • h2database - 1.4.194

我的H2DbConnector看起来像这样:

import entities.StubData._
import org.scalatest.{BeforeAndAfterAll, FunSuite}
import play.api.db.DBApi
import play.api.db.evolutions.Evolutions
import play.api.inject.guice.GuiceApplicationBuilder

trait H2DbConnector extends FunSuite with BeforeAndAfterAll {
  val appBuilder = new GuiceApplicationBuilder()
    .configure(configuration)

  val injector = appBuilder.injector
  lazy val databaseApi = injector.instanceOf[DBApi]

  override def beforeAll() = {
    Evolutions.applyEvolutions(databaseApi.database("default"))
  }

  override def afterAll() = {
    Evolutions.cleanupEvolutions(databaseApi.database("default"))
  }
}

在application.test.conf中

slick.dbs.default.driver = "slick.driver.H2Driver$"
slick.dbs.default.db.driver = "org.h2.Driver"
slick.dbs.default.db.url = "jdbc:h2:mem:play;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=FALSE"

我在evolutions 2.sql文件中有一个有问题的行

ALTER TABLE "Messages" ADD COLUMN "metaJson" JSONB NULL;

当我运行dao测试得到错误时

2017-12-21 16:08:40,409 [error] p.a.d.e.DefaultEvolutionsApi - Unknown data type: "JSONB"; SQL statement:
ALTER TABLE "Messages" ADD COLUMN "metaJson" JSONB NULL [50004-194] [ERROR:50004, SQLSTATE:HY004]
[info] OptoutsDaoTest *** ABORTED ***
[info]   play.api.db.evolutions.InconsistentDatabase: Database 'default' is in an inconsistent state![An evolution has not been applied properly. Please check the problem and resolve it manually before marking it as resolved.]
[info]   at play.api.db.evolutions.DatabaseEvolutions.$anonfun$checkEvolutionsState$3(EvolutionsApi.scala:285)
[info]   at play.api.db.evolutions.DatabaseEvolutions.$anonfun$checkEvolutionsState$3$adapted(EvolutionsApi.scala:270)
[info]   at play.api.db.evolutions.DatabaseEvolutions.executeQuery(EvolutionsApi.scala:317)
[info]   at play.api.db.evolutions.DatabaseEvolutions.checkEvolutionsState(EvolutionsApi.scala:270)
[info]   at play.api.db.evolutions.DatabaseEvolutions.evolve(EvolutionsApi.scala:239)
[info]   at play.api.db.evolutions.Evolutions$.applyEvolutions(Evolutions.scala:193)
[info]   at H2DbConnector.beforeAll(H2DbConnector.scala:15)
[info]   at H2DbConnector.beforeAll$(H2DbConnector.scala:14)
[info]   at OptoutsDaoTest.beforeAll(OptoutsDaoTest.scala:5)
[info]   at org.scalatest.BeforeAndAfterAll.liftedTree1$1(BeforeAndAfterAll.scala:212)
[info]   ...

你可以帮我解决这个问题吗?

答案

H2不支持JSONB柱类型。

所有支持的列类型Supported datatypes of H2

尝试在测试中使用postgres或编写两个数据库都能理解的标准SQL语句。

以上是关于使用H2数据库在游戏中运行测试时,未知数据类型为“JSONB”的主要内容,如果未能解决你的问题,请参考以下文章

org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 语句

H2 数据库 - MySQL 脚本的未知数据类型

H2 - Postgres 模式支持网络数据类型

使用 H2 内存数据库设置 Scala Play 测试

测试数据库类型 [H2] 的驱动程序在类路径中不可用

在运行时将类型 id 的对象转换为未知类型