2016-02-25 12 views
6

Ben slick's documentation yaklaşık DatabaseConfig okuyordu:Slick'te DatabaseConfig ve Veritabanı kullanımı arasındaki fark nedir?

Database için yapılandırma sözdizimi üzerine

, bir Kaygan sürücü artı bir araya Database eşleşen yapılandırmanızı sağlar DatabaseConfig şeklinde başka tabaka vardır. Bu, yapılandırma dosyasını yapılandırma dosyasını değiştirerek, özetinin farklı veritabanı sistemleri üzerinden yapılmasını kolaylaştırır. DatabaseConfigDatabase yaklaşımdan daha soyut temel veritabanı sistemi yapar nasıl bu bölümünü alamadım

? Varsayalım, ben şu testinde DatabaseConfig kullanıyorum:

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)) 
    } 
} 

i yapılandırma değişikliğin yanı sıra, PostgreSQL den MySQL benim temel veritabanı sistemi değiştirirseniz, görebileceğiniz gibi, ben import ifadeyi değiştirmek gerektiğini postgre API'sini mysql'lere aktarır. Öte yandan, ben Database kullanıyordum ise:

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)) 
    } 
} 

i Database kullanıyorum, altta yatan veritabanı üzerinde aynı değişim, iki değişikliklere neden olacaktır: yapılandırma dosyasındaki bir ve kaynak kodunda diğer. Bütün bunlar söylenince, bir yaklaşım diğerinden daha soyutdur? DatabaseConfig yanlış mı kullanıyorum?

cevap

4

Yakındasınız, ancak DatabaseConfig'u tam olarak kullanmıyorsunuz. Belirli bir sürücüyü içe aktarmak yerine, yapılandırmayla ilişkili sürücüyü almanız gerekir. Böyle bir şey çalışması gerekir: Bu, herhangi kodunu değiştirmek veya yeniden derlemek zorunda kalmadan de yapılandırma veritabanlarını geçmek için izin vermelidir

import org.scalatest.{Matchers, FlatSpec} 
import slick.backend.DatabaseConfig 
import slick.jdbc.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") 

    /* The api for the driver specified in the config is imported here. */ 
    import dbConfig.driver.api._ 

    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)) 
    } 
} 

.

+0

Teşekkürler..Ama varlık tanımlarımdaki 'dbConfig.driver.api._' öğesini nasıl kullanabilirim? 'Supplier'? Bu sınıflarda hala bazı veritabanı spesifik 'import' var. –

+1

Bunu halledebileceğiniz birkaç farklı yol var. Varlık tanımına erişilebilen yapılandırma nesnesini tutacak bir nesne oluşturabilirsiniz. Daha sonra şema varlığında DbConfigHolderObject.dbConfig.driver.api._' dosyasını içe aktarabilirsiniz. Ayrıca, kurulumu yapan ve şema varlıklarına karıştıran bir özellik de oluşturabilirsiniz. – DemetriKots

+1

Sadece bunu düşündüm ... Bunun en iyi yolu muhtemelen bir örtük kullanmak olacaktır. – DemetriKots

İlgili konular