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)
这也产生相同的错误.
所以我发现slick-pg解决方案是让它发挥作用的更好方法。如果您只需要代码中的 JSON 支持,即您有一个 DB 列,您只是想JsValue在使用 Postgres 的 JSON 列类型时将其表示为 Play ,那么您只需要编写一个配置文件,将来自slick-pg包.
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)
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)
因此,您需要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)
就是这样!
json问题是java/scala中没有标准的数据类型。所以你需要写“包装”。通过下面的链接,作者在数据库级别处理 json:
http://www.pateldenish.com/2013/05/inserting-json-data-into-postgres-using-jdbc-driver.html