В итоге я нашел решение, которое кажется довольно элегантным. Но я думаю, что некоторые улучшения можно было бы сделать и в 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 Exposed способность переименовать таблицы / столбцы во время выполнения. Тогда можно будет получить доступ к Kotlin объектам без дополнительных церемоний. Такая функция могла бы выглядеть в Jooq: https://www.jooq.org/doc/3.14/manual-single-page/#settings -render-mapping