2016-02-25 7 views
6

मैं DatabaseConfig के बारे में slick's documentation में पढ़ रहा था:Slick में डेटाबेस कॉन्फ़िगर और डेटाबेस का उपयोग करने के बीच क्या अंतर है?

Database के लिए विन्यास वाक्य रचना के शीर्ष पर, वहाँ DatabaseConfig का रूप है जो आप एक स्लिक ड्राइवर के साथ साथ एक साथ मिलान Database कॉन्फ़िगर कर सकते हैं में एक और परत है। यह को आसानी से कॉन्फ़िगरेशन फ़ाइल बदलकर विभिन्न प्रकार के डेटाबेस सिस्टम पर सार बनाना आसान बनाता है।

मैं इस हिस्से नहीं मिलता है, कैसे DatabaseConfig अंतर्निहित डेटाबेस प्रणाली Database दृष्टिकोण की तुलना में अधिक सार क्या है? मान लीजिए, मैं निम्नलिखित परीक्षण में 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 बयान बदलने की जरूरत है कि mygql के लिए पोस्टग्रे एपीआई आयात करता है। दूसरी ओर, अगर मैं 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)) 
    } 
} 

जब मैं Database उपयोग कर रहा हूँ, अंतर्निहित डेटाबेस पर भी यही बदलाव, दो परिवर्तन में परिणाम होगा: विन्यास फाइल में एक और स्रोत कोड में अन्य। इन सभी के साथ, एक दृष्टिकोण दूसरे की तुलना में अधिक सार कैसे है? क्या मैं DatabaseConfig गलत उपयोग कर रहा हूँ?

उत्तर

4

आप करीब हैं, लेकिन आप DatabaseConfig का उपयोग ठीक से नहीं कर रहे हैं। एक विशिष्ट ड्राइवर आयात करने के बजाय, आपको कॉन्फ़िगरेशन से जुड़े ड्राइवर को आयात करने की आवश्यकता है। कुछ इस तरह काम करना चाहिए:

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

यह आप किसी भी कोड बदलने के लिए या पुन: संयोजित किए बिना config में डेटाबेस स्विच करने की अनुमति चाहिए।

+0

धन्यवाद..लेकिन मैं अपनी इकाई परिभाषाओं में 'dbConfig.driver.api._' का उपयोग कैसे कर सकता हूं। 'Supplier'? मेरे पास अभी भी उन वर्गों में कुछ डेटाबेस विशिष्ट 'आयात' है। –

+1

कुछ अलग-अलग तरीके हैं जिन्हें आप इसे संभाल सकते हैं। आप कॉन्फ़िगरेशन ऑब्जेक्ट को पकड़ने के लिए ऑब्जेक्ट बना सकते हैं जो इकाई परिभाषा के लिए सुलभ है। फिर स्कीमा इकाई के भीतर आप 'DbConfigHolderObject.dbConfig.driver.api._' आयात कर सकते हैं। आप एक विशेषता भी बना सकते हैं जो सेटअप करता है और इसे स्कीमा इकाइयों में मिला देता है। – DemetriKots

+1

बस इस बारे में सोचा ... मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका शायद एक अंतर्निहित उपयोग करना होगा। – DemetriKots

संबंधित मुद्दे