我对 slick 及其 TableQueries 有点失望:例如,应用程序的模型可以是“class Persons(tag: Tag) extends Table[Person]”(其中 Person 是一个案例类,其中包含一些字段,例如名称、年龄、地址...)。 奇怪的是“val people = TableQuery[Persons]”包含所有记录。
例如,要拥有所有成年人,我们可以使用:
adults = persons.filter(p => p.age >= 18).list()
数据库的内容是否加载到变量persons中? 相反,是否有一种机制允许评估“成人”而不是“人”?(一种惰性变量)? 我们可以说“在任何时候,“人”都包含整个数据库”吗?
是否有可以帮助开发人员的良好实践、一些重要想法?
谢谢。
最佳答案
您错误地认为 persons
包含所有记录。 Table
和 TableQuery
类是 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。
关于scala - 光滑和斯卡拉 : What are TableQueries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338511/