Как параметризовать имя таблицы в Slick - PullRequest
2 голосов
/ 16 июня 2019
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) и на основе параметра года выбирал правильную таблицу.т. е. если прошедший год равен 1970, то имя таблицы будет 1970Table, но если пройденный год равен 1980, тогда таблица будет 1980Table.

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Попробуйте

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")
0 голосов
/ 28 июня 2019

В 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)
  }
}
...