2015-06-28 5 views
3

Я начал использовать 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 в базе данных агностиком и элегантным способом?

Этот вопрос находится недалеко от «How to write database-agnostic Play application and perform first-time database initialization?», но этот объект фокусируется на Slick 3.0.0. К сожалению, ответы, предоставленные с этим прежним вопросом, не нацелены на Slick 3.0.0, кроме тех, которые используют устаревший код.

+0

Если вы используете базовый/стандартный SQL, я думаю, вы можете использовать собственные запросы, таким образом, было бы легко перейти на другую СУБД (сделать вам действительно нужно?). – cchantep

+0

Спасибо @cchantep, вы имеете в виду использование простых SQL-запросов Slick (http://slick.typesafe.com/doc/3.0.0/sql.html)? О вашем вопросе, да, мне нравится переключать RDBMS для некоторых модульных тестов (где используется h2), а также я хотел бы любить меняться, не перестраивая свое приложение. – raphael

+0

Если это просто для модульного тестирования, вам действительно не нужны агностические вызовы, но для имитации одного и того же поведения БД, либо с БД в памяти, либо с использованием инфраструктуры тестирования JDBC (например, http://acolyte.eu.org) , – cchantep

ответ

8

Класс гладкого водителя, который вы ищете, это 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")) 
+1

Спасибо за этот ответ! Отлично! Спасибо вам! Я не могу голосовать за ваш ответ, но я поскользнулся! – raphael

+0

Просто что-то странное (это также в примере активатора), оно использует 'props.ddl.create', который в настоящее время устарел. Кажется, что «props.schema.create» выполняет эту работу. – raphael

+0

Если только это может быть агностиком-драйвером + generic таким образом, чтобы можно было расширять табличное определение и «TableQuery [T]», где «T <: Props» и все еще есть все преимущества ... Я не мог найти далеко. – Sorona

Смежные вопросы