如何在运行时暴露的 Kotlin 中调整 table 名称
How to adjust table name in Kotlin Exposed on runtime
我们正在使用以环境名称为前缀的数据库 table 名称,例如:
而不是只有 'Cities' 我们有 'ci_Cities', 'dev_Cities'和'prod_Cities'。
问题是模式定义是基于 Kotlin 对象的,这在用法上很好,但不允许我简单地在例如中注入 table 前缀。构造函数。
所以问题是如何在 Kotlin-Exposed 中实现这样的功能?
最后我找到了解决方案,看起来很优雅。
但我认为,在 Kotlin Exposed 中也可以做一些改进,这样在大多数情况下解决方案会更简洁。
City.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 具有在运行时重命名 tables/columns 的能力,那就太好了。这样就可以在没有额外仪式的情况下访问 Kotlin 对象。
这样的功能在 Jooq 中可能看起来像:
https://www.jooq.org/doc/3.14/manual-single-page/#settings-render-mapping
我们正在使用以环境名称为前缀的数据库 table 名称,例如: 而不是只有 'Cities' 我们有 'ci_Cities', 'dev_Cities'和'prod_Cities'。
问题是模式定义是基于 Kotlin 对象的,这在用法上很好,但不允许我简单地在例如中注入 table 前缀。构造函数。
所以问题是如何在 Kotlin-Exposed 中实现这样的功能?
最后我找到了解决方案,看起来很优雅。 但我认为,在 Kotlin Exposed 中也可以做一些改进,这样在大多数情况下解决方案会更简洁。
City.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 具有在运行时重命名 tables/columns 的能力,那就太好了。这样就可以在没有额外仪式的情况下访问 Kotlin 对象。 这样的功能在 Jooq 中可能看起来像: https://www.jooq.org/doc/3.14/manual-single-page/#settings-render-mapping