Плавная генерация кода с несколькими одинаковыми схемами - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть несколько идентичных схем, но когда Slick генерирует классы, он жестко кодирует там схему, чтобы я не мог использовать ее с другой схемой.

Например: class User(_tableTag: Tag) extends profile.api.Table[UserRow](_tableTag, Some("custom"), "user") { ...

Там custom - это имя схемы, и если я изменю его на None, вместо этого схема будет извлечена из строки соединения с БД.

Как мне получить генератор кода Slick для генерации всех классов?с None вместо с жестко закодированным именем схемы?

1 Ответ

0 голосов
/ 22 сентября 2018

Вы можете переопределить def createModelBuilder в вашем JdbcProfile.PostgresProfile, включенный в slick, уже делает это, чтобы удалить схему из определения сгенерированной таблицы, если == "public".

https://github.com/slick/slick/blob/14db18d7974ade35bf6d6dbc97bfe6e0490807c8/slick/src/main/scala/slick/jdbc/PostgresProfile.scala

trait PostgresProfile extends JdbcProfile {

  // line 61
  class ModelBuilder(mTables: Seq[MTable], ignoreInvalidDefaults: Boolean)(implicit ec: ExecutionContext) extends JdbcModelBuilder(mTables, ignoreInvalidDefaults) {

    override def createTableNamer(mTable: MTable): TableNamer = new TableNamer(mTable) {
      override def schema = super.schema.filter(_ != "public") // remove default schema
    }

  }

  // line 139
  override def createModelBuilder(tables: Seq[MTable], ignoreInvalidDefaults: Boolean)(implicit ec: ExecutionContext): JdbcModelBuilder =
    new ModelBuilder(tables, ignoreInvalidDefaults)

}

Вы должны быть в состоянии что-то сделатьаналогично в пользовательском профиле

trait NoSchemaProfile extends MyDatabaseProfile {

  class NoSchemaModelBuilder(mTables: Seq[MTable], ignoreInvalidDefaults: Boolean)(implicit ec: ExecutionContext) extends super.ModelBuilder(mTables, ignoreInvalidDefaults) {

    override def createTableNamer(mTable: MTable): TableNamer = new TableNamer(mTable) {
      override def schema = Option.empty[String]
    }

  }

  override def createModelBuilder(tables: Seq[MTable], ignoreInvalidDefaults: Boolean)(implicit ec: ExecutionContext): JdbcModelBuilder =
    new NoSchemaModelBuilder(tables, ignoreInvalidDefaults)
  }
}

, а затем укажите пользовательский профиль при генерации кода

...