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
。
答案 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)
}
}