【问题标题】:Add data type from PostgreSQL extension in Slick在 Slick 中从 PostgreSQL 扩展添加数据类型
【发布时间】:2015-03-28 02:28:15
【问题描述】:

我正在使用 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 数据类型,而无需将返回的对象转换为字符串并进行解析?

【问题讨论】:

    标签: postgresql scala postgis slick


    【解决方案1】:

    要成功使用它,您需要定义一个GetResult,如果您想将其插入/更新到db,可能还需要定义SetParameter。

    以下是从 slick tests 中提取的一些代码(ps 我假设您使用的是 slick 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,你可以尝试使用 slick-pg,它内置了对 jts.Geometry 和 PostGIS 的支持 slick 提升和纯 SQL。

    【讨论】:

      【解决方案2】:

      为了克服同样的问题,我使用了 slick-pg (0.8.2) 和 JTS 的 Geometry 类作为上一个答案中提到的 tminglei。使用slick-pg 处理 PostGIS 的几何类型有两个步骤:(i) 使用PgPostGISSupport 扩展 Slick 的 PostgresDriver 和 (ii) 为您的普通查询定义一个隐式转换器,如下所示。

      如this page所示,你应该先用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;"""
      )
      

      【讨论】:

        猜你喜欢
        • 2020-02-18
        • 2019-06-02
        • 1970-01-01
        • 2011-10-16
        • 2016-05-07
        • 2021-11-03
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多