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]
}
我正在尝试实现类似 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]
}