ScalaQuery のクエリ チュートリアルに従っていると、よくわからない興味深いことがわかりました。
定義されたデータベーススキーマは次のとおりです。
object Users extends Table[(Int, String, String)]("users") {
def id = column[Int]("id", O NotNull)
def first = column[String]("first", O NotNull)
def last = column[String]("last", O NotNull)
def * = id ~ first ~ last
}
そして、ここに私が使用するクエリがあります:
object Main
{
val database = Database.forURL("jdbc:sqlite:sample.db", driver = "org.sqlite.JDBC")
def main(args: Array[String]) {
database withSession {
val query1 = for (user <- Query(Users)) yield user.id ~ user.last
val query2 = for (user <- Users if user.id > 5) yield user.id ~ user ~ last
}
}
}
この場合、両方で のようなものquery1
をquery2
使用していることがわかります。これはuser.id
、先ほど定義したuser
シングルトンのタイプのようです。object Users
したがって、そのオブジェクトで定義されたすべてのメソッドがあります。
しかし、キーワードなしでクエリを直接実行しようとするとyield
、たとえば次のようになります。
for (user <- Users if user.id > 5) {
println ("UserID:" + user.id)
}
この場合、コンパイラは次のように文句を言います。
[error] src/main/scala/Test.scala:23: value id is not a member of (Int, String, String)
[error] println ("UserID:" + user.id)
user
println ステートメントは Tuple3 のタイプのようです。そしてuser
、次のような通常のタプルのように使用すると、機能します。
for (user <- Users if user.id > 5) {
println ("UserID:" + user._1)
}
そして、私がまだ使用している for 式のガードでuser.id
、 の型はuser
何ですか? user.id
ガードブロックとイールドブロックで使用できるのに、for 式の本体でタプルとして使用する必要があるのはなぜですか?
ありがとう。