この記事が投稿されたのは今から 2 年ほど前のことだが、当時の私はこの記事の内容についてかなり共感していた。 本当に ORM は百害あって一利なしか、標準的な ORM フレームワークの役割から考察してみる。
Exposed の例から抜粋:
object Users : Table() {
val id = varchar("id", 10) // Column<String>
val name = varchar("name", length = 50) // Column<String>
val cityId = (integer("city_id") references Cities.id).nullable() // Column<Int?>
override val primaryKey = PrimaryKey(id, name = "PK_User_ID") // name is optional here
}
object Cities : Table() {
val id = integer("id").autoIncrement() // Column<Int>
val name = varchar("name", 50) // Column<String>
override val primaryKey = PrimaryKey(id, name = "PK_Cities_ID")
}
fun main() {
(Users innerJoin Cities).slice(Users.name, Cities.name)
.select {
(Users.id.eq("andrey") or Users.name.eq("Sergey")) and
Users.id.eq("sergey") and Users.cityId.eq(Cities.id)
}.forEach {
println("${it[Users.name]} lives in ${it[Cities.name]}")
}
}
抜粋した Exposed の利用例は Kotlin の演算子オーバーライドとメソッドの中置記法を利用して、かなり DSL らしく記述されている。
柔軟な型システムをもつ言語の登場により、ORM フレームワークに大きくパラダイムシフトが起こりつつある、ということを Kotlin の ORM, Exposed を見て思うなどした。