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

Dav*_*ohn 6 postgresql scala sqldatatypes slick

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

def my_col = column[Option[String]]("my_col")
Run Code Online (Sandbox Code Playgroud)

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

列"my_col"的类型为json,但表达式的类型为字符变化

我也试过这个:

def my_col = column[Option[String]]("my_col", O.SqlType("json"))
Run Code Online (Sandbox Code Playgroud)

这也产生相同的错误.

Nic*_*obs 7

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

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

libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.18.0"
libraryDependencies += "com.github.tminglei" %% "slick-pg_play-json" % "0.18.0"
Run Code Online (Sandbox Code Playgroud)

第 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
Run Code Online (Sandbox Code Playgroud)

第 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._
...
}
Run Code Online (Sandbox Code Playgroud)

定义您的列

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

def someColumnName = column[JsValue]("some_column_name")
Run Code Online (Sandbox Code Playgroud)

就是这样!


vvg*_*vvg 3

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

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