使用带有Slick 2代码生成器的PostgreSQL JSON类型

时间:2014-03-16 20:24:47

标签: json postgresql scala playframework slick

我在Scala / Play应用程序中使用Slick 2 code generator来生成PostgreSQL数据库的表类。有些字段是JSON类型,它们由生成器转换为String。我想知道我是否能以某种方式使用slick-pg plugin使生成器识别Postgres JSON类型?

我试图直接在slick.driver.PostgresDriver

中延伸Build.scala
import slick.driver.PostgresDriver
import com.github.tminglei.slickpg._

trait MyPostgresDriver extends PostgresDriver
                          with PgArraySupport
                          with PgDateSupport
                          with PgRangeSupport
                          with PgHStoreSupport
                          with PgPlayJsonSupport
                          with PgSearchSupport
                          with PgPostGISSupport {

  override val Implicit = new ImplicitsPlus {}
  override val simple = new SimpleQLPlus {}

  trait ImplicitsPlus extends Implicits
                        with ArrayImplicits
                        with DateTimeImplicits
                        with RangeImplicits
                        with HStoreImplicits
                        with JsonImplicits
                        with SearchImplicits
                        with PostGISImplicits

  trait SimpleQLPlus extends SimpleQL
                        with ImplicitsPlus
                        with SearchAssistants
                        with PostGISAssistants
}

object MyPostgresDriver extends MyPostgresDriver

但我不知道如何在代码生成器例程中使用它而不是标准驱动程序:

SourceCodeGenerator.main(
    Array(
        "scala.slick.driver.PostgresDriver", //how do I use MyPostgresDriver here?
        "org.postgresql.Driver", 
        "jdbc:postgresql://localhost:5432/db?user=root&password=root", 
        "app", 
        "db"
    )
)       

2 个答案:

答案 0 :(得分:4)

你不能让发电机以这种方式拾取类型。它(或者更确切地说是从数据库模式中反向设计模型的Slick代码)当前只检测到一个充满类型的手,并简单地假定所有其他类型的String。这将在未来得到改善。为了使它对列使用不同的类型,您必须自定义生成器。相应的Slick文档示例实际上显示了如何自定义类型:

http://slick.typesafe.com/doc/2.0.0/code-generation.html#customization

答案 1 :(得分:0)

您还可以定义一个直接访问json树的函数

val jsonSQL=
SimpleFunction.binary[Option[String],String,Option[String]]("json_extract_path_text")