优雅的 Slick 和 Scala:什么是 TableQueries?

9

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

要获取所有成年人,我们可以使用以下代码:

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

数据库的内容是否加载在变量“persons”中? 相反,是否有一种机制可以评估不是“persons”,而是“adults”?(一种类似于延迟变量的机制) 我们可以说“在任何时候,“persons”包含整个数据库”吗?
有没有一些好的做法或重要的想法可以帮助开发人员?
谢谢。
1个回答

17

你错误地认为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类有关的大多数方法都将专注于生成Queries(即“select”语句)。在调用它们之前,它们实际上不会加载任何数据(例如通过调用.list().foreach方法)。

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

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


好的,现在明白了。谢谢。 - lolveley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接