我正在学习 Squeryl 并试图理解“使用”语法,但找不到关于它的文档。
在以下示例中,创建了两个数据库,A 包含单词Hello,B 包含Goodbye。目的是查询 A 的内容,然后附加单词World并将结果写入 B。
预期的控制台输出是Inserted Message(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] }
}
就目前而言,代码打印Inserted Message(2,GoodbyeWorld),除非在val 结果行的末尾添加了toList 。
即使在using(sessionB)内部进行评估,是否有某种方法可以将结果查询绑定到使用sessionA?这似乎比使用toList强制查询评估并将内容存储在内存中更可取。
更新
感谢 Dave Whittaker 的回答,下面的代码片段在不诉诸“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)
})
}