Slick 3.0.0 агностизм базы данных

Я начал использовать Slick 3.0.0, и мне нравится его лаконичный синтаксис. Тем не менее, я не смог найти способ использовать его независимо от базы данных.

В следующем примере, представленном в документации: http://slick.typesafe.com/doc/3.0.0/gettingstarted.html

Я хотел бы иметь возможность каким-либо образом отделить этот код используемой базы данных и избежать импорта базы данных, специфичной для моего кода (т.е. slick.driver.H2Driver.api._).

Я попытался избавиться от него, предоставив соединение с использованием шаблона тортов, но член ".result" тогда не был доступен.

Обходной путь будет импортировать slick.driver.JdbcDriver.api._, но это устарело и поэтому не должно быть хорошей отправной точкой.

Кто-нибудь нашел способ использовать Slick 3.0.0 в независимой и элегантной базе данных?

Этот вопрос не так далек от " Как написать независимое от базы данных приложение Play и выполнить первоначальную инициализацию базы данных?", Но этот вопрос фокусируется на Slick 3.0.0. Как и следовало ожидать, ответы на этот предыдущий вопрос не относятся к Slick 3.0.0, за исключением того, который использует устаревший код.

1 ответ

Решение

Класс водителя, которого вы ищете slick.driver.JdbcProfile,

Есть официальный пример проекта slick-multidb который вы можете получить через активатор ( github). Вот соответствующий код:

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
}

Код клиента:

val dao = new DAO(H2Driver)
import dao.driver.api._
db.run(dao.insert("foo", "bar"))
Другие вопросы по тегам