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