在 slick, scala 中处理 Postgres json 数据类型

Handling Postgres json datatype in slick, scala

我的架构中有一个 Postgres 'json' 列。 这是我的代码中的列映射:

def my_col = column[Option[String]]("my_col")

这不起作用,我在插入时得到的堆栈跟踪显示:

column "my_col" is of type json but expression is of type character varying

我也试过这个:

def my_col = column[Option[String]]("my_col", O.SqlType("json"))

这也会产生同样的错误。

问题是 java/scala 中没有标准的 json 数据类型。 所以你需要写'wrapper'。 由下面的 link 作者在数据库级别处理 json:

http://www.pateldenish.com/2013/05/inserting-json-data-into-postgres-using-jdbc-driver.html

有两种方法:

  1. .
  2. 那样使用映射
  3. 使用slick-pg包。

所以我发现 slick-pg 解决方案是实现此功能的更好方法。如果您只需要代码中的 JSON 支持,即您有一个 DB 列,在使用 Postgres 的 JSON 列类型时,您只想将其表示为 Play JsValue,您只需要编写一个混合了 slick-pg 包中适当功能的配置文件。

第一步:添加必要的依赖

libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.18.0"
libraryDependencies += "com.github.tminglei" %% "slick-pg_play-json" % "0.18.0"

第 2 步:撰写个人资料class

import com.github.tminglei.slickpg._
import slick.basic.Capability
import slick.jdbc.JdbcCapabilities

trait PostgresProfile extends ExPostgresProfile with PgPlayJsonSupport {
  def pgjson = "jsonb"

  override protected def computeCapabilities: Set[Capability] =
    super.computeCapabilities + JdbcCapabilities.insertOrUpdate

  override val api = PostgresJsonSupportAPI

  object PostgresJsonSupportAPI extends API with JsonImplicits
}

object PostgresProfile extends PostgresProfile

第 3 步:使用您的新个人资料class

因此您需要扩展 HasDatabaseConfigProvider 但使用您在上面步骤 #2 中定义的特征对其进行参数化,例如

class MyEntityRepository @Inject() (
  protected val dbConfigProvider: DatabaseConfigProvider
  ... // plus whatever other components you need, probably an ExecutionContext
) extends HasDatabaseConfigProvider[PostgresProfile] {

  import PostgresProfile.api._
...
}

定义您的列

这是简单的部分。在上面的 class、MyEntityRepository 中编写一个扩展 Table 的 private 或 package private Slick class 并像这样简单地定义您的列:

def someColumnName = column[JsValue]("some_column_name")

就是这样!