如何解决Scala Slick的foreach值不属于
这是在Scala Play项目中,用于连接到MariaDB。
cat build.sbt
...
jdbc,"org.mariadb.jdbc" % "mariadb-java-client" % "2.6.2","com.typesafe.slick" %% "slick" % "3.3.2",...
class Users(tag: Tag) extends Table[(...)](tag,"USERS") {...}
val users = TableQuery[Users]
for (u <- users) {...}
错误:
value foreach is not a member of slick.lifted.TableQuery[controller.Users]
for (u <- users) {
^
我尝试在for循环中将.result
添加到users
,但是得到了
value foreach is not a member of slick.jdbc.MySQLProfile.StreamingProfileAction[Seq[controller.Users#TableElementType],controller.Users#TableElementType,slick.dbio.Effect.Read]
for (u <- users.result) {
^
我在代码中的任何地方都没有db.run
。
解决方法
您似乎想遍历数据库中的用户。
这里需要几个概念:
-
表达式
users
是一种查询。像map
和filter
这样的方法是产生替代查询的一种方式。用foreach
遍历 query 并没有任何意义。 -
使用
users.results
,您可以执行一项操作(一种DBIOAction
)。您可以使用db.run
将其发送到数据库。同样,map
或flatMap
之类的方法是转换和组合动作的一种方法,但是用foreach
遍历动作并没有任何意义。
那该怎么办? users.result
的签名类似于DBIO[Seq[User]]
。如果要对每个用户执行某项操作(也许将它们打印出来),则可以构造一个操作来执行此操作。一种方法是将操作结果(用户列表)map
用于其他操作。也许:
val doSomethingWithEachUser: DBIO[Unit] =
users.result.map { seqUsers =>
seqUsers.foreach(println)
}
在这里,我们已使用map
将DBIO[Seq[User]]
的结果类型更改为DBIO[Unit]
。
然后可以使用doSomethingWithEachUser
将db.run
发送到数据库(可以这么说)。当您执行此操作时,将运行您的操作,并且当这些值可用时,将发生println
。
要切换回a理解,您可以看到我们需要构造一个新动作:
val doSomethingWithEachUser: DBIO[Unit] =
for {
allUsers <- messages.result
} yield allUsers.foreach(println)
...例如。
下一层位于Future
中,这是db.run
的结果。您将来也可以使用map
(或类似名称)来处理数据。 Slick几乎涉及所有类型的查询,操作和(最终)期货的构造块,并使用map
和flatMap
之类的组合器对其进行操纵。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。