带有多个相同模式的平滑代码生成

时间:2018-09-22 16:37:34

标签: scala slick-3.0

我有多个相同的架构,但是当Slick生成类时,它将在其中对架构进行硬编码,这样我就不能在其他架构中使用它。

例如: class User(_tableTag: Tag) extends profile.api.Table[UserRow](_tableTag, Some("custom"), "user") { ...

这里有custom是架构名称,如果我将其更改为None,它将代替数据库连接字符串中的架构。

如何使Slick代码生成器生成所有None而不是硬编码模式名称的类?

1 个答案:

答案 0 :(得分:1)

您可以在def createModelBuilder中覆盖JdbcProfile。 slick附带的PostgresProfile已经这样做,可以从生成的表定义(如果其== "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)
  }
}

,然后在生成代码时指定自定义配置文件