scala - 光滑和斯卡拉 : What are TableQueries?

标签 scala slick

我对 slick 及其 TableQueries 有点失望:例如,应用程序的模型可以是“class Persons(tag: Tag) extends Table[Person]”(其中 Person 是一个案例类,其中包含一些字段,例如名称、年龄、地址...)。 奇怪的是“val people = TableQuery[Persons]”包含所有记录。

例如,要拥有所有成年人,我们可以使用:

adults = persons.filter(p => p.age >= 18).list()

数据库的内容是否加载到变量persons中? 相反,是否有一种机制允许评估“成人”而不是“人”?(一种惰性变量)? 我们可以说“在任何时候,“人”都包含整个数据库”吗?

是否有可以帮助开发人员的良好实践、一些重要想法?

谢谢。

最佳答案

您错误地认为 persons 包含所有记录。 TableTableQuery 类是 SQL 表的表示,该库的全部目的是通过提供来简化与 SQL 数据库的交互一种方便的、类似 scala 的语法。

当你说

val adults = persons.filter{ p => p.age >= 18 }

您实际上已经创建了一个可以将其视为的 SQL 查询

SELECT * FROM PERSONS WHERE AGE >= 18

然后,当您调用 .list() 时,它会执行该查询,将数据库中的结果行转换回 Person 案例类的实例。大多数与 slick 的 Table 或 Query 类相关的方法都将专注于生成查询(即“select”语句)。在您调用它们之前(例如通过调用 .list().foreach),它们实际上不会加载任何数据。

至于好的实践和重要的想法,我建议您阅读他们的文档,并查看您感兴趣的任何类的 scaladocs。

http://slick.typesafe.com/docs/

关于scala - 光滑和斯卡拉 : What are TableQueries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338511/

相关文章:

scala - 如何使用 Slick 进行 INSERT IGNORE 查询?

scala - "right"在 Play Framework 中使用 write Slick 3.0 Scala 查询的方法

scala - 用列表 Play map 的scala json

scala - Slick 表中的动态表名覆盖

scala - 删除给定索引处的元素

scala - CombineBy Key Spark 方法

mysql - 具有多个连接、分组依据和具有的光滑查询

mysql - 如何使用 slick 3.2 在 scala 中使用 ADT 列表进行过滤

class - 在 Scala 中,将对象方法组合为类方法

java - 使用 JUnit 测试 GUI