代码之家  ›  专栏  ›  技术社区  ›  Anthony

如何在Slick中参数化表名

  •  0
  • Anthony  · 技术社区  · 5 年前
    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) 参数,并根据年份参数选择正确的表格。i、 e.如果过去的一年是 1970 那么表名是 1970Table 但是如果一年过去了 1980 那桌子就好了 1980Table .

    0 回复  |  直到 5 年前
        1
  •  1
  •   Mario Galic    5 年前

    尝试

    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")
    
        2
  •  0
  •   Artem Vlasov    5 年前

    有两个 apply TableQuery中的方法。 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))
    

    现在,您可以预定义所有需要的表并使用它们,或者像这样进行smth

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