如何在Slick中参数化表名

时间:2019-06-16 14:20:45

标签: scala slick

class MyTable(tag: Tag) extends Table[MyEntity](tag, "1970Table") {
  def id = column[Int]("id")

  override def * = 
  (
   id
  ) <> (MyEntity.tupled, MyEntity.unapply)
}

val myTable = TableQuery[MyTable]

class MyRepository(val config: DatabaseConfig[JdbcProfile])
   extends MyRepository[MyTable, String] {
  override val table: config.profile.api.TableQuery[MyTable] = myTable

  def insert(me: MyEntity): Future[Int] = {
     db.run(table += me)
  }
}

我在其他类似的课程中使用了这个

  val myRepository = new MyRepository(dbConfig)

  myRepository.insert(myrecord)

问题

我不想使用硬编码的表名,而是使表名动态化。

我想更改insert方法,使其接受year (int)参数,并根据year参数选择正确的表。即,如果传入的年份为1970,则表名称为1970Table,但如果传入的年份为1980,则表为1980Table

2 个答案:

答案 0 :(得分:1)

尝试

class MyRepository(val config: DatabaseConfig[JdbcProfile]) {
  import config._
  import profile.api._

  abstract class MyTable(tag: Tag, name: String) extends Table[MyEntity](tag, name) {
    def id = column[Int]("id")
    override def * = (id) <> (MyEntity.tupled, MyEntity.unapply)
  }

  class Table1970(tag: Tag) extends MyTable[MyEntity](tag, "1970Table")
  class Table1980(tag: Tag) extends MyTable[MyEntity](tag, "1980Table")

  val table1970 = TableQuery[Table1970]
  val table1980 = TableQuery[Table1980]

  def insert(me: MyEntity, year: Int): Future[Int] = db.run {
    year match {
      case "1970" => table1970 += me
      case "1980" => table1980 += me 
    }
  }
}

现在

val myRepository = new MyRepository(dbConfig)
myRepository.insert(myrecord, "1970")

答案 1 :(得分:0)

TableQuery中有两个apply方法。 val myTable = TableQuery[MyTable]-
这是使用宏来创建MyTable。 另一个是这样定义的:

def apply[E <: AbstractTable[_]](cons: Tag => E): TableQuery[E] =
    new TableQuery[E](cons)

所以您可以这样做

class MyTable(tag: Tag, tableName: String) extends Table[MyEntity](tag, tableName)
...
def myTable(name: String) = TableQuery[MyTable](tag =>  new MyTable(tag, name))

现在,您可以预定义所需的所有表,然后使用它们或执行类似的操作

class MyRepository(val config: DatabaseConfig[JdbcProfile])
   extends MyRepository[MyTable, String] {
  override def table(year: Int): config.profile.api.TableQuery[MyTable] = myTable(year.toString)

  def insert(me: MyEntity, year: Int): Future[Int] = {
     db.run(table(year) += me)
  }
}
相关问题