2015-06-19 4 views
5

के साथ प्ले 2.4 में टेबल निर्माण मुझे प्ले-स्लिम मॉड्यूल ऊपर और चल रहा है और एप्लिकेशन प्रारंभ के दौरान डेटाबेस में आवश्यक तालिकाओं को बनाने के लिए विकास का उपयोग भी कर रहा हूं।play-slick 1.0

काम करने के लिए विकास के लिए इसे 1.sql स्क्रिप्ट लिखना आवश्यक है जिसमें तालिका परिभाषाएं शामिल हैं जिन्हें मैं बनाना चाहता हूं। फिलहाल यह इस तरह दिखता है:

# --- !Ups 

CREATE TABLE Users (
    id UUID NOT NULL, 
    email varchar(255) NOT NULL, 
    password varchar(255) NOT NULL, 
    firstname varchar(255), 
    lastname varchar(255), 
    username varchar(255), 
    age varchar(255), 
    PRIMARY KEY (id) 
); 

# --- !Downs 

DROP TABLE Users; 

तो स्लिक दूर इतना अच्छा लेकिन के लिए सही ढंग से काम करने के लिए यह भी मेरी मेज की परिभाषा जानने की जरूरत।

class UserDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] { 
    import driver.api._ 

    private val Users = TableQuery[UsersTable] 

    def all(): Future[Seq[User]] = db.run(Users.result) 

    def insert(user: User): Future[User] = db.run(Users += user).map { _ => user } 

    //Table definition 
    private class UsersTable(tag:Tag) extends Table[User](tag,"users"){ 
    def id = column[UUID]("id", O.PrimaryKey) 
    def email = column[String]("email") 
    def password = column[String]("password") 
    def firstname = column[Option[String]]("firstname") 
    def lastname = column[Option[String]]("lastname") 
    def username = column[Option[String]]("username") 
    def age = column[Int]("age") 

    def * = (id, email,password,firstname,lastname,username,age) <> ((User.apply _).tupled, User.unapply) 
    } 
} 

मैं मूल रूप से अब दो अलग अलग स्थानों में एक ही तालिका परिभाषा है: तो मैं एक UserDAO वस्तु जो इस तरह दिखता है। एक बार 1.sql स्क्रिप्ट में और एक बार UserDAO कक्षा में।

मुझे वास्तव में यह डिज़ाइन पसंद नहीं है! दो अलग-अलग स्थानों में एक ही टेबल परिभाषाएं सही नहीं लगती हैं।

क्या उपयोगकर्ताडाओ कक्षाओं के अंदर तालिका परिभाषाओं से विकास स्क्रिप्ट उत्पन्न करने का कोई तरीका है? या स्टार्टअप के दौरान टेबल परिभाषाओं को उत्पन्न करने का एक बिल्कुल अलग तरीका है (शायद केवल स्लिम का उपयोग करके)? मैं वास्तव में केवल स्लिम टेबल परिभाषा का उपयोग करना चाहता हूं और कष्टप्रद एसक्यूएल स्क्रिप्ट से छुटकारा पा सकता हूं।

मैं play-2.4 और play-slick-1.0

धन्यवाद एक बहुत उपयोग कर रहा हूँ।

उत्तर

4

महान प्रश्न - मैं आपके जैसे ही नाव में था!

TableQuery[UsersTable].schema.create 

which'll आप के लिए डेटाबेस तालिका बनाने के लिए:

मैं सिर्फ डीएओ और इस कोड को होगा। .sql के लिए कोई ज़रूरत नहीं है।

इसके विपरीत, .create के बजाय .drop का उपयोग करें।

आप reduceLeft का उपयोग करके कई तालिकाओं की तालिका निर्माण को भी जोड़ सकते हैं। यहाँ कैसे मैं यह कर दिया गया है:

val profile = slick.driver.H2Driver 
import profile.api._ 
+1

कहाँ वास्तव में आप रखा है 'TableQuery [UsersTable] .schema.create' फोन:

lazy val allTables = Array( TableQuery[AcceptanceTable].schema, [... many more ...] TableQuery[UserTable].schema ).reduceLeft(_ ++ _) /** Create all tables in database */ def create = { allTables.create } /** Delete all tables in database */ def drop = { allTables.drop } 

सभी कि इस तरह के रूप दायरे में ड्राइवर एपीआई की आवश्यकता होगी? – evermean

+0

निम्नलिखित के दायरे में यह बहुत महत्वपूर्ण है: वैल प्रोफाइल = slick.driver.H2Driver आयात प्रोफ़ाइल.एपीआई__ – bjfletcher

+0

टिप्पणियों के साथ कोई नई पंक्तियां नहीं, लेकिन अपडेट किए गए उत्तर के नीचे देखें। – bjfletcher