Scala 如何在Slick中参数化表名
问题 我不希望有一个硬编码的表名,而是希望使表名成为动态的 我想更改Scala 如何在Slick中参数化表名,scala,slick,Scala,Slick,问题 我不希望有一个硬编码的表名,而是希望使表名成为动态的 我想更改insert方法,使其接受year(int)参数,并根据year参数选择正确的表。i、 e.如果传入的年份为1970,则表名为1970表,但如果传入的年份为1980,则表名为1980表 val myRepository = new MyRepository(dbConfig) myRepository.insert(myrecord) TableQuery中有两个apply方法val myTable=TableQue
insert
方法,使其接受year(int)
参数,并根据year参数选择正确的表。i、 e.如果传入的年份为1970
,则表名为1970表
,但如果传入的年份为1980
,则表名为1980表
val myRepository = new MyRepository(dbConfig)
myRepository.insert(myrecord)
TableQuery中有两个
apply
方法val myTable=TableQuery[myTable]
-这一个使用宏来创建
MyTable
。
另一个定义如下:
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, "1970")
现在,您可以预定义所有需要的表并使用它们,或者像这样执行smth
class MyTable(tag: Tag, tableName: String) extends Table[MyEntity](tag, tableName)
...
def myTable(name: String) = TableQuery[MyTable](tag => new MyTable(tag, name))
您是否尝试向
MyTable
类添加另一个参数,如name
,并将其进一步传递给Slick Table。然后在MyRepository
中为1980表格再创建一个变量,并选择在插入方法中使用哪一个?在MyRepository
中的table
变量将覆盖table
变量。因此,我无法添加多个表
变量。请详细说明表1970
和表1980
在您的答案中所指的内容……无法理解它们在问题示例中的适用性。感谢我对这种方法的关注是,它将要求我复制粘贴我将制作的每个表1970
,表1978
,等等类的代码,因为插入/删除/etc方法每年都是相同的。唯一改变的是表名。
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)
}
}