【问题标题】:scala slick handling more than 2 same structure tables by one modelscala slick 通过一个模型处理超过 2 个相同的结构表
【发布时间】:2019-04-17 05:39:53
【问题描述】:

我正在尝试实现类似日志表的功能。

假设我有...

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

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

当前我的实现

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"
}

//...

写多少我需要的表是最后的选择,有什么方法可以聪明地实现这一点吗?

欢迎提出任何建议。

【问题讨论】:

  • 这些表格是按日期还是其他逻辑分隔的?
  • 是的,它将由 ID 分隔。像这样idNum % 100 == targetTableNumber

标签: scala slick


【解决方案1】:

为什么不简单地将表名作为参数传递?

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

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

【讨论】:

  • 你写的方式仍然需要为类名做一些事情。类名也需要不同。我确实尝试过您在此处询问之前发布的方式,但最终成为需要eval 的东西。或者您还有其他解决方案吗?
【解决方案2】:

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

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]
}

【讨论】:

  • 有趣,如果 foreignKey def 中的表名也需要作为构造函数参数传递,您将如何在 LogTable 上执行 foreignKey def?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2014-08-10
  • 2022-01-05
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多