在 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
Jooq postgre 在 play2.5 scala 中插入错误