Как настроить имя таблицы в Kotlin Exposed во время выполнения

Мы используем имена таблиц базы данных с префиксом имен среды, например: вместо просто «Cities» у нас есть «ci_Cities», «dev_Cities» и prod_Cities.

Проблема в том, что определения схемы основаны на объектах Kotlin, что хорошо в использовании, но не позволяет мне просто вводить префикс таблицы, например. конструктор.

Итак, вопрос в том, как реализовать такую ​​функциональность в Kotlin-Exposed?


person Aarti    schedule 19.06.2020    source источник
comment
Пожалуйста, проверьте комментарии к этой проблеме   -  person Tapac    schedule 21.06.2020
comment
Главное в решении вышеуказанной проблемы заключается в том, что невозможно легко обеспечить ценность из внешнего мира. Поскольку схема является объектами, вы не можете предоставить текущую переменную среды простым и понятным способом для этого объекта схемы. Установка значения объекта ужасна и просто не работает: при запуске конструктора Table () tableName уже вызывается как часть инициализации. Как мне инициализировать internalTableName значением, например, из Весна @Value (someproperty)?   -  person Aarti    schedule 23.06.2020


Ответы (1)


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

person Aarti    schedule 06.07.2020