具有多个相同模式的流畅代码生成
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"
.
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)
}
}
然后在生成代码时指定自定义配置文件
我有多个相同的架构,但是当 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"
.
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)
}
}
然后在生成代码时指定自定义配置文件