我有多个相同的架构,但是当Slick生成类时,它将在其中对架构进行硬编码,这样我就不能在其他架构中使用它。
例如:
class User(_tableTag: Tag) extends profile.api.Table[UserRow](_tableTag, Some("custom"), "user") { ...
这里有custom
是架构名称,如果我将其更改为None
,它将代替数据库连接字符串中的架构。
如何使Slick代码生成器生成所有None
而不是硬编码模式名称的类?
答案 0 :(得分:1)
您可以在def createModelBuilder
中覆盖JdbcProfile
。 slick附带的PostgresProfile
已经这样做,可以从生成的表定义(如果其== "public"
中删除该模式。
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)
}
}
,然后在生成代码时指定自定义配置文件