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

时间:2015-11-04 07:21:06

标签: postgresql scala slick sqldatatypes

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

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

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

  

专栏" my_col"是json类型,但表达式是字符类型   变化

我也试过了:

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

这也会产生同样的错误。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

有两种方法:

  1. 像在answer中一样使用映射。
  2. 使用slick-pg软件包。

答案 2 :(得分:0)

因此,我发现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")

就是这样!