실제 SQL 문과 유사하지만 Kotlin이 제공하는 type-safe를 갖고 있다.
일반적으로 org.jetbrains.exposed.sql.Table
을 상속해서 테이블을 작성한다.
object StarWarsFilms : Table() {
val id: Column<Int> = integer("id").autoIncrement()
val sequelId: Column<Int> = integer("sequel_id").uniqueIndex()
val name: Column<String> = varchar("name", 50)
val director: Column<String> = varchar("director", 50)
override val primaryKey = PrimaryKey(id, name = "PK_StarWarsFilms_Id") // PK_StarWarsFilms_Id is optional here
}
Tables that contains
Int
id with the nameid
이게 무슨 말인지 잘 이해가 가지 않음
테이블의 기본키가 정수형 ID. → 자동으로 id
라는 정수형 기본 키 컬럼을 갖게됨
이게 바로 Surrogate Table!
object StarWarsFilms : IntIdTable() {
val sequelId: Column<Int> = integer("sequel_id").uniqueIndex()
val name: Column<String> = varchar("name", 50)
val director: Column<String> = varchar("director", 50)
}
insert
쿼리로 작성한다. query를 사용해서 코드를 작성한다는 점이 Kotlin DSL의 특징인 것 같다.
// SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION)
// VALUES ('RUSSIA', 'St. Petersburg', 300)
Cities.insert {
it[name] = "St. Petersburg"
it[country] = Country.RUSSIA
it[population] = 500
}
insertAndGetId
는 새로운 row를 추가하고 그 행의 ID를 반환한다. IntIdTable()
일 때만 사용할 수 있다.// SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION)
// VALUES ('RUSSIA', 'St. Petersburg', 300)
**val id = Cities.insertAndGetId** {
it[name] = "St. Petersburg"
it[country] = Country.RUSSIA
it[population] = 500
}