在Slick和Scala中处理Postgres的json数据类型

10

我在我的架构中有一个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 JSON列映射到Hibernate值类型的重复问题。 - vvg
3个回答

10

因此,我发现使用slick-pg解决方案是使其正常工作的更好方式。如果你只需要在代码中支持 JSON,即你有一个数据库列,你只想用 Play JsValue 表示,同时使用 Postgres 的 JSON 列类型,那么你只需要编写一个配置文件,从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

第三步:使用你的新档案类

因此,您需要扩展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")

就是这样了!


4
有两种方法:
  1. 使用像答案中所述的映射。
  2. 使用slick-pg包。

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接