【问题标题】:How to adjust table name in Kotlin Exposed on runtime如何在运行时调整 Kotlin Exposed 中的表名
【发布时间】:2020-07-06 16:39:34
【问题描述】:

我们使用以环境名称为前缀的数据库表名,例如: 而不仅仅是“Cities”,我们还有“ci_Cities”、“dev_Cities”和“prod_Cities”。 p>

问题是 Schema 定义是基于 Kotlin 对象的,这在使用中很好,但不允许我简单地在例如注入表前缀。构造函数。

那么问题是如何在 Kotlin-Exposed 中实现这样的功能?

【问题讨论】:

  • 请查看this issue的cmets
  • 解决上述问题的主要是不能轻易地从外部提供价值。因为 Schema 是对象,所以您不能以简单干净的方式向该 Schema 对象提供当前环境变量。在对象上设置值很糟糕,而且根本不起作用:当 Table() 构造函数启动时, tableName 已经作为初始化的一部分被调用。我应该如何使用来自例如的值初始化 internalTableName Spring @Value("someproperty")?

标签: kotlin kotlin-exposed


【解决方案1】:

最后我找到了解决方案,这似乎很优雅。 但我认为,在 Kotlin Exposed 中也可以进行一些改进,以便在大多数情况下解决方案更加简洁。

城市.kt

data class City(val id: Int, val name: String, val timestamp: Instant)

Schema.kt

import org.jetbrains.exposed.sql.ResultRow
import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.`java-time`.timestamp

class CitiesSchema(environment: String) {
    val cities = CitiesTable(environment)
}

class CitiesTable(environment: String) : Table(environment + "_Cities") {
    val id = varchar("id", 99)
    val name = varchar("name", 99)
    val timestamp = timestamp("timestamp")
}

CitiesRepository.kt

class CitiesRepository(dataSource: DataSource, private val schema: CitiesSchema) {
    private val database = Database.connect(dataSource).defaultFetchSize(10000)

    override fun save(city: City): City {
        transaction(database) {
            schema.cities.insert {
                it[schema.cities.id] = city.id
                it[schema.cities.name] = city.name
                it[schema.cities.timestamp] = city.timestamp
            }
        }
        return city
    }

然后在例如Spring 你可以实例化你的模式:

@Bean
public CitiesSchema schema(@Value("${spring.application.env}") String environment) {
    return new CitiesSchema(environment);
}

如果 Kotlin Exposed 能够在运行时重命名表/列,那就太好了。这样就可以访问 Kotlin 对象而无需额外的仪式。 这样的功能在 Jooq 中可能看起来像: https://www.jooq.org/doc/3.14/manual-single-page/#settings-render-mapping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多