具有多个相同模式的流畅代码生成

Slick code generation with multiple identical schemas

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

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

custom 是架构名称,如果我将其更改为 None,它将改为从数据库连接字符串中获取架构。

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

您可以在 JdbcProfile 中覆盖 def createModelBuilder。 slick 中包含的 PostgresProfile 已经执行此操作以从生成的 table 定义中删除架构,如果其 == "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)
  }
}

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