Scala Slick 3.0.0数据库不可知论

Scala Slick 3.0.0数据库不可知论,scala,slick,Scala,Slick,我开始使用Slick 3.0.0,我喜欢它简洁的语法。尽管如此,我还是无法找到一种与数据库无关的方法来使用它 在以下文档中提供的示例中: 我希望能够以某种方式将所用数据库的代码解耦,并避免在我的代码中导入特定于数据库的代码(即slick.driver.H2Driver.api.) 我试图通过使用蛋糕模式提供连接来摆脱它,但是“.result”成员当时不可用 一种解决方法是导入slick.driver.JdbcDriver.api.,但它已被弃用,因此不应该是一个好的起点 有人找到了一种以不可知数

我开始使用Slick 3.0.0,我喜欢它简洁的语法。尽管如此,我还是无法找到一种与数据库无关的方法来使用它

在以下文档中提供的示例中:

我希望能够以某种方式将所用数据库的代码解耦,并避免在我的代码中导入特定于数据库的代码(即
slick.driver.H2Driver.api.

我试图通过使用蛋糕模式提供连接来摆脱它,但是“.result”成员当时不可用

一种解决方法是导入
slick.driver.JdbcDriver.api.
,但它已被弃用,因此不应该是一个好的起点

有人找到了一种以不可知数据库和优雅的方式使用Slick 3.0.0的方法吗


这个问题离“”不远,但重点是Slick 3.0.0。很遗憾,前一个问题的答案并不是针对Slick 3.0.0的,除非它使用了不推荐的代码。

您要查找的Slick驱动程序类是
Slick.driver.JdbcProfile

有一个官方的示例项目
slick multidb
,您可以通过activator()获得它。以下是相关代码:

import scala.language.higherKinds
import slick.driver.JdbcProfile

/** All database code goes into the DAO (data access object) class which
  * is parameterized by a Slick driver that implements JdbcProfile.
  */
class DAO(val driver: JdbcProfile) {
  // Import the Scala API from the driver
  import driver.api._

  class Props(tag: Tag) extends Table[(String, String)](tag, "PROPS") {
    def key = column[String]("KEY", O.PrimaryKey)
    def value = column[String]("VALUE")
    def * = (key, value)
  }
  val props = TableQuery[Props]

  /** Create the database schema */
  def create: DBIO[Unit] =
    props.ddl.create

  /** Insert a key/value pair */
  def insert(k: String, v: String): DBIO[Int] =
    props += (k, v)

  /** Get the value for the given key */
  def get(k: String): DBIO[Option[String]] =
    (for(p <- props if p.key === k) yield p.value).result.headOption

  /** Get the first element for a Query from this DAO */
  def getFirst[M, U, C[_]](q: Query[M, U, C]): DBIO[U] =
    q.result.head
}

如果您使用基本/标准SQL,我想您可以使用本机查询,这样可以很容易地切换到另一个RDBMS(您真的需要吗?)?关于你的问题,是的,我喜欢为一些单元测试切换RDBMS(其中使用h2),并且我也喜欢能够在不必重建我的应用程序的情况下进行更改。如果这只是为了单元测试,你不需要真正的不可知调用,而是能够模拟相同的DB行为,无论是内存中的DB还是使用JDBC测试框架(比如)。这似乎是重复的:@cchantep,那么你建议在内存DB(即H2)上使用我的RDBMS(在我的例子中是PostgreSQL)的特定驱动程序进行单元测试?谢谢你的回答!太好了!谢谢你!我还不能投票支持你的答案,但我会尽快!只是一些奇怪的事情(在activator的例子中也是如此),它使用了目前不推荐使用的'props.ddl.create'。似乎是
props.schema.create
完成了这项工作。如果这可以是驱动程序无关+泛型的,这样就可以扩展表定义和
TableQuery[T]
where
T@Sorona我不知道您可以扩展
表的定义。但是,我认为如果您针对单个数据库驱动程序解决问题,您可以使用相同的技术来支持多个数据库驱动程序。
val dao = new DAO(H2Driver)
import dao.driver.api._
db.run(dao.insert("foo", "bar"))