2015-05-08 4 views
5

Próbuję dowiedzieć się, Slick (Scala funkcjonalny model relacyjny). Zacząłem budować prototyp w Slick 3.0.0, ale oczywiście ... większość dokumentacji jest albo nieaktualna, albo niekompletna.Slick/Scala: Co to jest Rep [Bind] i jak zmienić go w wartość?

Udało mi się dojść do punktu, w którym mogę utworzyć schemat i zwrócić obiekt z bazy danych.

Problem polega na tym, że otrzymuję zwrot "Rep [Bind]", a nie obiekt, który powinienem odzyskać. Nie wiem, co zrobić z tą wartością. Na przykład, jeśli spróbuję czegoś takiego jak rep.countDistinct.result, dostaję awarię.

Oto krótkie streszczenie kodu ... niektórzy usunięte dla zwięzłość:

class UserModel(tag: Tag) extends Table[User](tag, "app_dat_user_t") { 
    def id = column[Long]("n_user_id", O.PrimaryKey) 
    def created = column[Long]("d_timestamp_created") 

    def * = (id.?, created) <> (User.tupled, User.unapply) 
} 

case class User(id: Option[Long], created: Long) 

val users = TableQuery[UserModel] 

(users.schema).create 

db.run(users += User(Option(1), 2)) 

println("ID is ... " + users.map(_.id)) // prints "Rep[Bind]"... huh? 

val users = for (user <- users) yield user 

println(users.map(_.id).toString) // Also prints "Rep[Bind]"... 

nie mogę znaleźć sposobu na „rozpakowanie” obiekt Rep i nie mogę znaleźć żadnego wyraźnego wyjaśnienia co to jest i jak z niego korzystać.

+0

tylko trochę więcej informacji: Większość dokumentacji mam znalazłem sugestie, że mogę zrobić coś takiego jak "users.foreach (println)", ale users.foreach jest niezdefiniowany. – Zac

Odpowiedz

7

Rep [] zastępuje typ danych Column [] używany w slick.

users.map (_. ID) zwraca wartość kolumny ('n_user_id') dla wszystkich rzędów

val result : Rep[Long] = users.map(_.id) 

users.map(_.id) // => select n_user_id from app_dat_user_t; 

Otrzymana wartość jest typu kolumnowej [Long] [ który jest teraz Rep [Long]]. Nie można bezpośrednio wydrukować wartości powyżej Resultset gdyż nie jest innego typu kolekcji scala

  • można najpierw przekonwertować go do jakiejś kolekcji scala a następnie wydrukować go jako poniżej:

    var idList : List[Long] = List() 
    users.map(_.id).forEach(id => 
    idList = idList :+ id 
    ) 
    

    println (obiektu IDList) ** // jeśli trzeba wydrukować wszystkie identyfikatory naraz

  • innego można po prostu użyć:

    users.map(_.id).forEach(id => 
    println(id) 
    ) // print for each id 
    

I

val users = TableQuery[UserModel] // => returns Query[UserModel, UserModel#TableElementType, Seq]) 

val users = for (user <- users) yield user // => returns Query[UserModel, UserModel#TableElementType, Seq]) 

oba oznaczają to samo, więc można korzystać bezpośrednio z poprzedniego i usunąć ten ostatni

Powiązane problemy