我有一个Postgres' json'我的架构中的列。 这是我的代码中的列映射:
def my_col = column[Option[String]]("my_col")
哪个不起作用,我在插入时得到的堆栈跟踪说:
专栏" my_col"是json类型,但表达式是字符类型 变化
我也试过了:
def my_col = column[Option[String]]("my_col", O.SqlType("json"))
这也会产生同样的错误。
答案 0 :(得分:2)
问题是java / scala中没有标准的json
数据类型。
所以你需要写'包装'。
通过以下链接,作者在数据库级别处理了json:
http://www.pateldenish.com/2013/05/inserting-json-data-into-postgres-using-jdbc-driver.html
答案 1 :(得分:2)
答案 2 :(得分:0)
因此,我发现slick-pg
解决方案是使其更有效的方法。如果您所需要的只是代码中的JSON支持,即您有一个DB列,而您仅想在使用Postgres的JSON列类型时将其表示为Play JsValue
,则只需编写一个配置文件即可slick-pg
包中的适当功能。
libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.18.0"
libraryDependencies += "com.github.tminglei" %% "slick-pg_play-json" % "0.18.0"
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")
就是这样!