减少案例 class 模型的 Slick 定义中的样板文件
Reducing boilerplate in Slick definitions for case class models
在学习技巧和设置最终保存到 PostgreSQL 的模型 classes 时,我看到了这种模式(下面的代码)。有一个简单的案例 class 作为模型,然后扩展 Table 处理关系映射。
case class Cat(name: String, color: String)
/* Table mapping
*/
class CatsTable(tag: Tag) extends Table[Cat](tag, "CAT") {
def name = column[String]("name", O.PrimaryKey)
def color = column[String]("color", O.NotNull)
def * = (name, color) <> (Cat.tupled, Cat.unapply _)
}
在许多常见情况下,这让我觉得是一堆不必要的样板,但我只是在学习,所以我不知道我在这里遗漏了什么。有没有更简单的方法从 case class Cat
开始并以我可以用来对数据库中 Cat 的 CRUD 实例进行 CRUD 的对象结束?例如。似乎没有必要指定 String
类型的属性最终应该是 column[String]
,等等。在其他框架中,我可能必须添加注释或其他内容来指示我想将哪个作为主键或不可为空,但我不会真正编写单独的映射。通过手写这些映射,我主要只是花更多的时间,并有机会以微妙的方式搞砸其他简单的情况。
我最理想的是从 case class Cat
开始,在上面撒上神奇的框架灰尘,然后得到一个具有合理默认值的 CatsTable
,必要时我可以 override/customize .
当我搜索这方面的文档时,我通常会回到 schema code generation 但这似乎倒退了;我不想从 existing/populate RDBMS 生成 table 映射,我想从头开始。
对于此问题的未来搜索者,以下是我的发现:
您不能减少样板文件,它必须存在。 Slick 有一个 code generation 的功能,但并不完全相同;如果你有一个 SQL 模式,它会为你生成 table 映射。
现在,您可能会问,如果它可以自动为您生成 table 映射,那您为什么还要编写并维护它们?看起来答案是这样可以在编译时加载类型定义。当然,它们可以生成,但它们不会 "type safe" 因为编译器不会根据这些类型检查您的代码,而没有实际代码在编译时运行。
所以这似乎取决于这一层类型安全的感知价值。如果您认为有必要,那么此代码不是样板文件。如果您认为此特定层的类型安全不是绝对必要的,那么这确实是样板文件。
这似乎可以归结为更大的 FP 假设,即类型安全始终很重要,对我来说,这是一个 "purity" 争论的结尾。
在学习技巧和设置最终保存到 PostgreSQL 的模型 classes 时,我看到了这种模式(下面的代码)。有一个简单的案例 class 作为模型,然后扩展 Table 处理关系映射。
case class Cat(name: String, color: String)
/* Table mapping
*/
class CatsTable(tag: Tag) extends Table[Cat](tag, "CAT") {
def name = column[String]("name", O.PrimaryKey)
def color = column[String]("color", O.NotNull)
def * = (name, color) <> (Cat.tupled, Cat.unapply _)
}
在许多常见情况下,这让我觉得是一堆不必要的样板,但我只是在学习,所以我不知道我在这里遗漏了什么。有没有更简单的方法从 case class Cat
开始并以我可以用来对数据库中 Cat 的 CRUD 实例进行 CRUD 的对象结束?例如。似乎没有必要指定 String
类型的属性最终应该是 column[String]
,等等。在其他框架中,我可能必须添加注释或其他内容来指示我想将哪个作为主键或不可为空,但我不会真正编写单独的映射。通过手写这些映射,我主要只是花更多的时间,并有机会以微妙的方式搞砸其他简单的情况。
我最理想的是从 case class Cat
开始,在上面撒上神奇的框架灰尘,然后得到一个具有合理默认值的 CatsTable
,必要时我可以 override/customize .
当我搜索这方面的文档时,我通常会回到 schema code generation 但这似乎倒退了;我不想从 existing/populate RDBMS 生成 table 映射,我想从头开始。
对于此问题的未来搜索者,以下是我的发现:
您不能减少样板文件,它必须存在。 Slick 有一个 code generation 的功能,但并不完全相同;如果你有一个 SQL 模式,它会为你生成 table 映射。
现在,您可能会问,如果它可以自动为您生成 table 映射,那您为什么还要编写并维护它们?看起来答案是这样可以在编译时加载类型定义。当然,它们可以生成,但它们不会 "type safe" 因为编译器不会根据这些类型检查您的代码,而没有实际代码在编译时运行。
所以这似乎取决于这一层类型安全的感知价值。如果您认为有必要,那么此代码不是样板文件。如果您认为此特定层的类型安全不是绝对必要的,那么这确实是样板文件。
这似乎可以归结为更大的 FP 假设,即类型安全始终很重要,对我来说,这是一个 "purity" 争论的结尾。