如何在Slick中动态检查数据库品牌/类型

时间:2015-03-12 13:49:39

标签: scala slick slick-2.0

我在生产中使用Oracle,在单元测试中使用H2。由于我们使用Oracle Spatial,因此我需要以某种方式表示几何对象,这些对象在Oracle和H2中会有所不同。我不需要操作数据库中的几何类型(或者至少我没有期望能够做到这一点:-))。因此,我只是将几何图形映射到H2中的文本字段,这样我就可以输入/输出。

我想像这样映射几何列:

def shape = if (<database is oracle)
    column[Geometry]("SHAPE") (geometry2SdoGeometryMapper(TmcGeometry.srid))
  else if (<database is oracle>)
    column[Geometry]("SHAPE", O.DBType("text")) (geometry2TextMapper)
  else 
    sys.error(s"Unimplemented database type $<database type>) 

2 个答案:

答案 0 :(得分:0)

一种方法是将此shape方法抽象为更高阶的Slick组件,该组件采用具有相应子类型的类型参数。这样的事情可以奏效:

trait DBtype {
  val GeometryMapper: {the expected type}
  val Driver: Driver
}
GeometryRepository[B <: DBType] {
  def shape = B.GeometryMapper
}
trait Oracle extends DBtype {
  override val GeometryMapper = column[Geometry]("SHAPE") (geometry2SdoGeometryMapper(TmcGeometry.srid))
  override val Driver = OracleDriver
}

请参阅this example以了解数据库类型参数化。

答案 1 :(得分:0)

您可以执行driver.isInstanceOf[OracleDriver]driver.isInstanceOf[H2Driver]