我正在学习Squeryl并尝试理解'using'语法,但无法找到它的文档.
在以下示例中,创建了两个数据库,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] }
}
Run Code Online (Sandbox Code Playgroud)
目前,代码打印Inserted Message(2,GoodbyeWorld),除非在val结果行的末尾添加了toList.
有没有办法将结果查询绑定到使用sessionA,即使在using(sessionB)中进行求值?这似乎比使用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)
})
}
Run Code Online (Sandbox Code Playgroud)
首先,我对缺乏文档表示歉意。using() 构造是一项新功能,仅在 SNAPSHOT 版本中可用。实际上,昨天我与 Max 讨论了早期采用者的一些文档问题,我们正在努力解决这些问题。
我无法想到将特定会话绑定到查询的方法。看看你的例子,看起来一个简单的解决方法就是反转你的交易。当您创建查询时,Squeryl 实际上并不访问数据库,它只是创建一个表示要执行的 SQL 的 AST,因此此时您不需要发出 using(sessionA)。然后,当您准备好迭代结果时,您可以将查询调用包装在嵌套在 using(sessionB) 中的 using(sessionA) 中。那有意义吗?
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |