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ứcDatabaseConfig
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ớiDatabase
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?
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 đó. –
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
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