Closed. This question needs to be more focused 。它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。

7年前关闭。



Improve this question




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

例如,要拥有所有成年人,我们可以使用:
adults = persons.filter(p => p.age >= 18).list()

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

是否有好的做法,一些可以帮助开发人员的重要想法?

谢谢。

最佳答案

您认为 persons 包含所有记录是错误的。 TableTableQuery 类是 SQL 表的表示,该库的重点是通过提供方便的、类似于 Scala 的语法来简化与 SQL 数据库的交互。

当你说

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

您实质上已经创建了一个SQL查询,您可以将其视为
SELECT * FROM PERSONS WHERE AGE >= 18

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

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

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

10-06 05:46
查看更多