簡體   English   中英

在Slick中添加PostgreSQL擴展的數據類型

[英]Add data type from PostgreSQL extension in Slick

我正在使用PostgreSQL的PostGIS擴展,我正在嘗試從表中檢索PGgeometry對象。

這個版本工作正常:

import java.sql.DriverManager
import java.sql.Connection
import org.postgis.PGgeometry

object PostgersqlTest extends App {
  val driver = "org.postgresql.Driver"
  val url = "jdbc:postgresql://localhost:5432/gis"

  var connection:Connection = null

  try {
    Class.forName(driver)
    connection = DriverManager.getConnection(url)

    val statement = connection.createStatement()
    val resultSet = statement.executeQuery("SELECT geom FROM table;")

    while ( resultSet.next() ) {
      val geom = resultSet.getObject("geom").asInstanceOf[PGgeometry]
      println(geom)
    }
  } catch {
    case e: Exception => e.printStackTrace()
  }
  connection.close()
}

我需要能夠使用Slick自定義查詢執行相同的操作。 但是這個版本不起作用:

Q.queryNA[PGgeometry]("SELECT geom FROM table;")

並給我這個編譯錯誤

Error:(50, 40) could not find implicit value for parameter rconv: scala.slick.jdbc.GetResult[org.postgis.PGgeometry]
  val query = Q.queryNA[PGgeometry](
                                   ^

有沒有一種簡單的方法在Slick中添加PGgeometry數據類型而不必將返回的對象轉換為String並解析它?

要成功使用它,您需要定義一個GetResult ,如果要將其插入/更新到db,可能需要SetParameter

這是從光滑測試中提取的一些代碼(ps我假設您使用的是光滑的2.1.0):

implicit val getUserResult = GetResult(r => new User(r.<<, r.<<))
case class User(id:Int, name:String)

val userForID = Q[Int, User] + "select id, name from USERS where id = ?"

但是,如果你的java / scala類型是jts.Geometry而不是PGgeometry ,你可以嘗試使用PGgeometry slick-pg ,它內置支持jts.GeometryPostGIS用於slick Lifted和Plain SQL。

為了克服同樣的問題,我使用了slick slick-pg (0.8.2)和JTS的Geometry類作為上一個答案中提到的tminglei。 使用slick-pg處理PostGIS的幾何類型有兩個步驟:(i)使用PgPostGISSupport擴展Slick的PostgresDriver,以及(ii)為您的普通查詢定義隱式轉換器,如下所示。

本頁所示,您應首先使用PgPostGISSupport擴展PostgresDriver:

object MyPostgresDriver extends PostgresDriver with PgPostGISSupport {

    override lazy val Implicit = new Implicits with PostGISImplicits
    override val simple = new Implicits with SimpleQL with PostGISImplicits with PostGISAssistants

    val plainImplicits = new Implicits with PostGISPlainImplicits
}

使用擴展驅動程序中plainImplicits中定義的隱式轉換,您可以將查詢編寫為:

import com.vividsolutions.jts.geom.LineString // Or any other JTS geometry types.
import MyPostgresDriver.plainImplicits._
import scala.slick.jdbc.GetResult

case class Row(id: Int, geom: LineString)

implicit val geomConverter = GetResult[Row](r => {
    Row(r.nextInt, r.nextGeometry[LineString])
})

val query = Q.queryNA[Row](
"""SELECT id, geom FROM table;"""
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM