【问题标题】:Slick code generation with multiple identical schemas具有多个相同模式的流畅代码生成
【发布时间】:2018-09-22 16:37:33
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: scala slick-3.0


    【解决方案1】:

    您可以在 JdbcProfile 中覆盖 def createModelBuilder。 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)
      }
    }
    

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

    【讨论】:

    • 超级!感谢您的详尽回答。
    • 我有一个问题可能很简单,但我想不通。运行sbt compile 时,我得到java.lang.ClassNotFoundException: net.mindlevel.NoSchemaProfile。 built.sbt 声明 val slickDriver = "net.mindlevel.NoSchemaProfile",我是否必须做任何事情才能使 sbt 能够解析本地特征?
    • 啊啊,我当然不能用还没有编译的模块。
    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 2018-01-06
    • 2022-12-17
    • 1970-01-01
    • 2021-09-16
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多