Как изменить имя таблицы в Kotlin, отображаемое во время выполнения - PullRequest
0 голосов
/ 19 июня 2020

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

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

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

1 Ответ

1 голос
/ 06 июля 2020

В итоге я нашел решение, которое кажется довольно элегантным. Но я думаю, что некоторые улучшения можно было бы сделать и в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...