Scala Slick值foreach不是
这是在Scala Play项目中,用于连接到MariaDBScala Slick值foreach不是,scala,for-loop,foreach,slick,Scala,For Loop,Foreach,Slick,这是在Scala Play项目中,用于连接到MariaDB cat build.sbt ... jdbc, "org.mariadb.jdbc" % "mariadb-java-client" % "2.6.2", "com.typesafe.slick" %% "slick" % "3.3.2", ... class用户(tag:tag)扩展表[(…)](tag,“User
cat build.sbt
...
jdbc,
"org.mariadb.jdbc" % "mariadb-java-client" % "2.6.2",
"com.typesafe.slick" %% "slick" % "3.3.2",
...
class用户(tag:tag)扩展表[(…)](tag,“Users”){…}
val users=TableQuery[users]
对于(u,看起来您希望迭代数据库中的用户
这里有几个您需要的概念:
- 表达式
users
是一种查询。像map
和filter
这样的方法是生成替代查询的一种方法。使用foreach
对查询进行迭代实际上没有意义
- 对于
用户.results
您有一个操作(一种DBIOAction
)。这是您可以使用db.run
发送到数据库的内容。同样,像map
或flatMap
这样的方法是转换和组合动作的一种方式,但是使用foreach
对动作进行迭代实际上没有意义
那么该怎么做呢?用户的签名。result
类似于DBIO[Seq[User]]]
。如果您想对每个用户做些什么,可以打印出来,您可以构造一个操作来完成。一种方法是将操作的结果(用户列表)映射到其他内容。可能:
val doSomethingWithEachUser: DBIO[Unit] =
users.result.map { seqUsers =>
seqUsers.foreach(println)
}
这里我们使用map
将DBIO[Seq[User]]
的结果类型更改为DBIO[Unit]
然后,您可以使用db.run
将doSomethingWithEchuser
发送到数据库(也就是说)。当您这样做时,您的操作将运行,并且当值可用时,将发生println
要切换回a进行理解,您可以看到我们需要构建一个新动作:
val doSomethingWithEachUser: DBIO[Unit] =
for {
allUsers <- messages.result
} yield allUsers.foreach(println)
val doSomethingWithEachUser:DBIO[单位]=
为了{
无需使用yield
子句就可以使用for
进行理解。foreach()
调用您的集合。如果您的集合不支持foreach()
方法,则您必须使用不同的方法对集合进行迭代。
val doSomethingWithEachUser: DBIO[Unit] =
users.result.map { seqUsers =>
seqUsers.foreach(println)
}
val doSomethingWithEachUser: DBIO[Unit] =
for {
allUsers <- messages.result
} yield allUsers.foreach(println)