2016-02-25 15 views
6

Tôi đã đọc về DatabaseConfig trong slick's documentation:Sự khác nhau giữa việc sử dụng DatabaseConfig và Database trong Slick là gì?

Trên đầu trang của các cú pháp cấu hình cho Database, có một lớp theo hình thức DatabaseConfig cho phép bạn cấu hình một tài xế Slick cộng với một phù hợp với Database với nhau. Điều này giúp dễ dàng để trừu tượng qua các loại hệ thống cơ sở dữ liệu khác nhau bằng cách chỉ cần thay đổi tệp cấu hình .

Tôi không nhận được phần này, cách DatabaseConfig làm cho hệ thống cơ sở dữ liệu cơ bản trừu tượng hơn cách tiếp cận Database? Giả sử, tôi đang sử dụng DatabaseConfig trong các thử nghiệm sau đây:

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

Như bạn có thể thấy, nếu tôi thay đổi hệ thống cơ sở dữ liệu cơ bản của tôi từ PostgreSQL để MySQL, ngoài việc thay đổi cấu hình, tôi cần phải thay đổi tuyên bố rằng import nhập API postgre vào mysql's. Mặt khác, nếu tôi đã được sử dụng 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)) 
    } 
} 

Khi tôi đang sử dụng Database, cùng sự thay đổi trên cơ sở dữ liệu cơ bản, sẽ cho kết quả trong hai thay đổi: một trong tập tin cấu hình và còn lại trong mã nguồn. Với tất cả những điều này đang được nói, cách một cách tiếp cận trừu tượng hơn so với cách tiếp cận khác? Tôi có đang sử dụng DatabaseConfig không?

Trả lời

4

Bạn ở gần, nhưng bạn không sử dụng đúng cách DatabaseConfig đúng cách. Thay vì nhập một trình điều khiển cụ thể, bạn cần nhập trình điều khiển được liên kết với cấu hình. Một cái gì đó như thế này sẽ hoạt động:

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

Điều này sẽ cho phép bạn chuyển đổi cơ sở dữ liệu trong cấu hình mà không phải thay đổi mã hoặc biên dịch lại.

+0

thanks..bằng cách tôi có thể sử dụng 'dbConfig.driver.api._' trong định nghĩa đối tượng của mình, ví dụ: 'Nhà cung cấp'? Tôi vẫn có một số cơ sở dữ liệu cụ thể 'import' trong các lớp đó. –

+1

Có một vài cách khác nhau để bạn có thể xử lý việc này. Bạn có thể tạo một đối tượng để giữ đối tượng cấu hình có thể truy cập được đến định nghĩa thực thể. Sau đó, trong thực thể lược đồ, bạn có thể 'nhập DbConfigHolderObject.dbConfig.driver.api._'. Bạn cũng có thể tạo ra một đặc điểm mà thiết lập và trộn nó vào các thực thể lược đồ. – DemetriKots

+1

Chỉ cần nghĩ về điều này ... Tôi nghĩ rằng cách tốt nhất để xử lý nó có lẽ sẽ là sử dụng một tiềm ẩn. – DemetriKots

Các vấn đề liên quan