数据库

时间:2016-01-12 22:08:11

标签: scala row slick

我开始使用光滑和scala,似乎我仍然没有基础知识:

我正在使用slick 3.0.0和scala 2.11.7,我正在连接到Oracle数据库。

我想获取表格中的行数,所以我去搜索并找到以下内容: 1)这个告诉我.run不存在:

mytable.length.run

2)这个告诉我发现了类型不匹配:slick.lifted.Rep [Int]和期望字符串:

var q = for(u <- mytable) yield u.id
print(q.size)

3)这个编译并运行但打印Rep(Pure $ @ 309962262):

var q = for{row <- mytable} yield row
println(Query(q.length))

所以我不确定是不是因为我不明白这是如何工作的,但我想的是会发生以下情况:

A)constructQuery b)&#34;运行&#34;查询。

所以我使用的其他查询如下:

val db = Database.forConfig("Oracle")
try{
   val f: Future[Unit] = {
   val query: StreamingDBIO[Seq[String], String] = participants.map(_.id).result // A)"Construct query"
   val stremQuery: DatabasePublisher[String] = db.stream(query) //B) "Run query"
   streamQuery.foreach(println)
}
Await.result(f, Duration.Inf)

}
finally db.close

我错过了什么? 3号没有给我我想要的东西,因为它不在db.stream/db.run/db.something命令下?或者我只是输了=)

提前致谢 托纳

1 个答案:

答案 0 :(得分:3)

光头查询数据库基本上包括以下三个步骤:

  1. 创建Query
  2. Query转换为Action
  3. 在数据库上执行Action
  4. 所以你的例子看起来像这样(类型是可选的,为了清楚起见而添加):

    val query = mytable.length  // length is an aggregation 
    val action = query.result
    val result: Future[Int] = db.run(action)
    
    // Access result in a non blocking way (recommended):
    result.map(count: Int => ...)
    
    // or for completeness use Await (not recommended):
    val count: Int = Await.result(result, Duration.Inf)
    

    进一步阅读: