2016-02-25 4 views
6

SlickでDatabaseConfigとDatabaseを使用する違いは何ですか?私は<a href="http://slick.typesafe.com/doc/3.1.1/database.html#databaseconfig" rel="noreferrer">slick's documentation</a>約<code>DatabaseConfig</code>を読んでいた

設定構文の上にDatabaseのために、あなたが一緒に スリックドライバープラス一致Databaseを設定することができますDatabaseConfigの形で別の 層があります。 コンフィグレーションファイルを変更するだけで、さまざまな種類のデータベースシステムに簡単にアクセスできます。 DatabaseConfigDatabaseアプローチよりも抽象的基盤となるデータベースシステムを作るどのように私はこの部分を得ることはありません

、?仮定し、私は次のテストでDatabaseConfigを使用しています:

import org.scalatest.{Matchers, FlatSpec} 
import slick.backend.DatabaseConfig 
import slick.driver.JdbcProfile 
import slick.driver.PostgresDriver.api._ 

import scala.concurrent.ExecutionContext.Implicits.global 

class DatabaseConfigTest extends FlatSpec with Matchers { 
    def withDb(test: DatabaseConfig[JdbcProfile] => Any) = { 
    val dbConfig = DatabaseConfig.forConfig[JdbcProfile]("abstract") 

    try test(dbConfig) 
    finally dbConfig.db.close() 
    } 

    "DatabaseConfig" should "work" in withDb { dbConfig => 
    import Supplier._ 

    val cities = suppliers.map(_.city) 

    dbConfig.db.run(cities.result).map(_.foreach(println)) 
    } 
} 

私は、構成の変更に加えて、PostgreSQLからMySQLに私の基盤となるデータベースシステムを変更する場合は、見ることができるように、私はimport文を変更する必要があることpostgre APIをmysqlにインポートします。一方、私はDatabaseを使用していた場合は、次のソースコード内の設定ファイルに1つ、他:私は、基礎となるデータベースに同じ変更をDatabaseを使用している場合は

import org.scalatest.{FlatSpec, Matchers} 
import slick.driver.PostgresDriver.api._ 
import slick.jdbc.JdbcBackend.Database 

import scala.concurrent.ExecutionContext.Implicits.global 

class DatabaseTest extends FlatSpec with Matchers { 
    def withDb(test: Database => Any) = { 
    val db = Database.forConfig("default") 

    try test(db) 
    finally db.close() 
    } 

    "Supplier names" should "be fetched" in withDb { db => 
    import Supplier._ 

    val names = suppliers.map(_.name) 

    db.run(names.result).map(_.foreach(println)) 
    } 
} 

、2つの変化をもたらすでしょう。これらのすべてが言われて、どのアプローチが他のアプローチよりも抽象的であるか? DatabaseConfigを間違って使用していますか?

答えて

4

あなたは近くですが、DatabaseConfigは正しく使用されていません。特定のドライバをインポートするのではなく、設定に関連付けられたドライバをインポートする必要があります。これは、コードを変更したり再コンパイルしなくても、構成内のデータベースを切り替えることができます。

+0

ありがとうございます。私のエンティティ定義で 'dbConfig.driver.api._'をどうすれば使用できますか?サプライヤ?私はまだそれらのクラスにデータベース固有の 'import'を持っています。 –

+1

これを処理できる方法はいくつかあります。エンティティ定義にアクセス可能な設定オブジェクトを保持するオブジェクトを作成できます。スキーマエンティティ内で、 'DbConfigHolderObject.dbConfig.driver.api._'をインポートできます。また、セットアップを行い、それをスキーマエンティティに混在させる特性を作成することもできます。 – DemetriKots

+1

ちょうどこれを考えた...私はそれを処理する最善の方法はおそらく暗黙的に使用することだと思う。 – DemetriKots

関連する問題

 関連する問題