gpt4 book ai didi

scala - Squeryl session 管理与 'using'

转载 作者:行者123 更新时间:2023-12-04 20:52:54 25 4
gpt4 key购买 nike

我正在学习 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) , 除非 列表 添加在 的末尾验证结果 线。

有没有办法绑定(bind) 结果查询使用 session A 即使在 内进行评估使用( session B) ?这似乎比使用 更可取。列表 强制查询评估并将内容存储在内存中。

更新

感谢 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)
})
}

最佳答案

首先,我为缺乏文档表示歉意。 using() 构造是仅在 SNAPSHOT 构建中可用的新功能。实际上,我昨天与 Max 讨论了早期采用者的一些文档问题,我们正在努力解决这些问题。

我无法想到将特定 session 绑定(bind)到查询的方法。查看您的示例,看起来一个简单的解决方法就是反转您的交易。当您创建查询时,Squeryl 实际上并不访问数据库,它只是创建一个表示要执行的 SQL 的 AST,因此您此时不需要发出 using(sessionA)。然后,当您准备好迭代结果时,您可以将查询调用包装在嵌套在 using(sessionB) 中的 using(sessionA) 中。那有意义吗?

关于scala - Squeryl session 管理与 'using',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com