2011-12-05 18 views
5

我正在學習Squeryl,並試圖理解'使用'的語法,但無法找到它的文檔。Squeryl會話管理與'使用'

在以下示例中兩個數據庫被創建,A包含單詞你好,和B含有再見。其意圖是要查詢A的內容,然後附加字世界並將結果寫入到B.

預期控制檯輸出是插入的消息(2,的HelloWorld)

object Test { 
    def main(args: Array[String]) { 
     Class.forName("org.h2.Driver"); 
     import Library._ 

     val sessionA = Session.create(DriverManager.getConnection(
       "jdbc:h2:file:data/dbA","sa","password"),new H2Adapter) 
     val sessionB = Session.create(DriverManager.getConnection(
       "jdbc:h2:file:data/dbB","sa","password"),new H2Adapter) 

     using(sessionA){ 
      drop; create 
      myTable.insert(Message(0,"Hello")) 
     } 
     using(sessionB){ 
      drop; create 
      myTable.insert(Message(0,"Goodbye")) 
     } 

     using(sessionA){ 
      val results = from(myTable)(s => select(s))//.toList 

      using(sessionB){ 
       results.foreach(m => { 
        val newMsg = m.copy(msg = (m.msg+"World")) 
        myTable.insert(newMsg) 
        println("Inserted "+newMsg) 
       }) 
      } 
     } 
    } 

    case class Message(val id: Long, val msg: String) extends KeyedEntity[Long] 
    object Library extends Schema { val myTable = table[Message] } 
} 

由於它代碼打印插入消息(2,GoodbyeWorld),除非toList加上val結果行結束。

是否有綁定的結果查詢使用sessionA使用(sessionB)的內部評估,即使某種方式?這似乎優於使用toList來強制查詢評估並將內容存儲在內存中。

更新

感謝戴夫·惠特克的回答,下面的代碼片段修復它,而不訴諸「toList」和糾正我的兩個「使用」和查詢的運行的理解。

val results = from(myTable)(s => select(s)) 

using(sessionA){    
    results.foreach(m => { 
     val newMsg = m.copy(msg = (m.msg+"World")) 
     using(sessionB){myTable.insert(newMsg)} 
     println("Inserted "+newMsg) 
    }) 
} 

回答

3

首先,我對缺乏文檔表示歉意。 using()構造是僅在SNAPSHOT構建中可用的新功能。實際上,我昨天曾與Max討論過早期採用者的一些文檔問題,我們正在努力解決這些問題。

我沒有辦法想到將特定的會話綁定到查詢。看看你的例子,看起來像一個簡單的工作將是反轉你的交易。當您創建一個查詢時,Squeryl實際上並不訪問數據庫,它只是創建一個代表要執行的SQL的AST,因此您不需要在該點發出使用(sessionA)。然後,當您準備迭代結果時,可以在使用(sessionB)中嵌套的使用(sessionA)中包裝查詢調用。那有意義嗎?

+0

Dave,感謝您在Squeryl上的所有努力,這已經改變了我對ORM的看法,並堅定了我對Scala的承諾。我很驚訝,使用()應該只在快照中,因爲我確信我只是從網站上取下了這個jar。已經用您的解決方案更新了我的問題,這些解決方案確實可以說明問題。 – Pengin