scala slick 通过一个模型处理超过 2 个相同的结构表

scala slick handling more than 2 same structure tables by one model

我正在尝试实现类似 log tables 的东西。

假设我有...

final class LogTable(tag: Tag) extends Table[LogModel](tag,"log"){
  def createdAt = column[Timestamp]("created_at")
  //...
}

由于日志为单个 table 获取了太多记录,因此我想使用具有完全相同结构但名称不同的多个 table。换句话说,我只想更改 Table[](tag,"this name") 并且如果可能的话,我想让它在从外部调用时像单个 table 一样工作。

当前我的实现

class LogBase(tag: Tag) extends Table[LogModel](tag,"log"){
  def createdAt = column[Timestamp]("created_at")
  //...
}

final class LogTable1(tag:Tag) extends LogBase(tag){
  override val tableName = "log1"
}

final class LogTable2(tag:Tag) extends LogBase(tag){
  override val tableName = "log2"
}

//...

尽管我需要尽可能多地写 tables 是最后的选择,但有什么办法可以巧妙地实现这一目标吗?

欢迎任何类型的建议。

为什么不直接将 table 名称作为参数传递?

class LogBase(tag: Tag, id: Int) extends Table[LogModel](tag, s"log${id % 100}")

你可以创建一个工厂来抽象这个逻辑

就像 nmat 提到的那样, 制作一个 table class 生成器 class 解决问题。

class LogBase(tableNum: Int){
  class LogTable(tag: Tag) extends Table[LogModel](tag,s"log$tableNum"){
    def createdAt = column[Timestamp]("created_at")
    //...
  }
}  

以及如何使用它

val tables = (1 to 10).toList.map { num =>
  val clazz = new LogBase(num)
  TableQuery[clazz.LogTable]
}