【问题标题】:How do I print the results of a slick query如何打印 slick 查询的结果
【发布时间】:2016-03-14 16:18:33
【问题描述】:

我有一张名为 Materials 的表格。我使用 slicks 模式自动生成来为我创建 TableQuery 类。

我不知道如何只打印一个简单查询的结果。

Materials.map(_.name)

我试过了

val m = Materials.map(_.name).toString()

println(m)

得到结果

Rep(Bind)

如果我尝试

Materials.map(_.name).forEach(m => println(m))

我得到一个编译错误

value forEach is not a member of slick.lifted.Query[slick.lifted.Rep[Option[String]],Option[String],Seq]

澄清一下,我只使用 slick 3.1.0 而不是玩 slick

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    你已经写了一个Query,但是需要调用它的result方法将它转换成一个Action

    val query = materials.map(_.name)
    val action = query.result
    val results: Future[ Seq[Option[ String ] ]] = db.run( action)
    results.foreach( println )
    

    db 对象需要根据您使用的 Slick 版本进行初始化。例如SlickPlay Slick

    我假设你有这个

    val materials = TableQuery[Materials]
    

    【讨论】:

    • 这给了我一个编译错误,说它需要 db.run(action) 处的 slick.dbio.DBIOAction[Seq[String],slick.dbio.NoStream,Nothing] 作为操作
    • 我没有 val Materials = TableQuery[YourMaterialsTableMapping]。该表名为 Materials,因此我使用了 val materials = TableQuery[Materials]。我必须将 Future[ Seq[String]] 更改为 Future[Seq[Option[String]]] 才能使其正常工作,但现在可以正常工作。编辑您的答案以包含选项部分,我会将其标记为答案。
    • 根据您的建议编辑
    • 我看到这已成为一个更受欢迎的问题,所以我想为那些想要回答这个问题的人澄清一下。我正在使用 slicks 模式自动生成来执行此操作,并且它位于我用来学习 scala 的演示应用程序上。我建议其他看到这个问题的人了解 scala Future 是什么,因为这是一个灵活的查询执行的结果,但并不总是返回 Seq 选项字符串。这将取决于。而且 Future 就像一个 monad n 打印是一个副作用 n 如果你想对 monad 产生副作用,你必须使用 foreach 方法来“解包”它。
    【解决方案2】:

    您可以使用 map 评估具有副作用的函数:

    Materials.map(println(_.name))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多