【问题标题】:Handling Postgres json datatype in slick, scala在 slick、scala 中处理 Postgres json 数据类型
【发布时间】: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"))

这也会产生相同的错误。

【问题讨论】:

标签: postgresql scala slick sqldatatypes


【解决方案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】:

    有两种方式:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2017-10-02
        • 1970-01-01
        • 2019-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多