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

Posted

技术标签:

【中文标题】在 slick、scala 中处理 Postgres json 数据类型【英文标题】:Handling Postgres json datatype in slick, scala 【发布时间】:2016-02-04 14:19:24 【问题描述】:

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

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

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

列“my_col”是 json 类型,但表达式是字符类型 变化的

我也试过这个:

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

这也会产生相同的错误。

【问题讨论】:

Mapping postgreSQL JSON column to Hibernate value type的可能重复 【参考方案1】:

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

第 1 步:添加必要的依赖项

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

第 2 步:编写配置文件类

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 步:使用新的个人资料类

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

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

  import PostgresProfile.api._
...

定义您的列

这是最简单的部分。在上面的类中,MyEntityRepository 编写一个私有或包私有的 Slick 类,扩展 Table 并简单地定义你的列,如下所示:

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

就是这样!

【讨论】:

【参考方案2】:

有两种方式:

    使用answer 中的映射。 使用slick-pg 包。

【讨论】:

【参考方案3】:

问题在于 java/scala 中没有标准的json 数据类型。 所以你需要写'包装器'。 通过下面的链接作者是否在数据库级别处理 json:

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

【讨论】:

以上是关于在 slick、scala 中处理 Postgres json 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

为不存在的表 slick scala (Slick 3.0.0, scala) 创建一个类 Table

浅谈Slick- 基本功能描述

Jooq postgre 在 play2.5 scala 中插入错误

IDEA中搭建Scala + Play+Slick环境

如何在 Scala Slick 中运行补丁/部分数据库更新?

Scala 用于理解 Slick Query