0Pricing
Kotlin Academy · レッスン

Table DSLによるテーブル定義

カラム、主キー、外部キーを持つ型付きテーブルスキーマを定義します。

「Table DSLによるテーブル定義」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

Exposedのテーブルオブジェクト

Exposedでは、データベーステーブルを、Table(Query DSL)またはIntIdTable/LongIdTable/UUIDTable(DAO layer)を継承するKotlinのシングルトンobjectとして表現します。カラム定義はKotlinのプロパティです。

基本的なテーブル定義

Tableを継承し、組み込みのカラムファクトリ関数を使用してカラムを定義します:

import org.jetbrains.exposed.sql.Table

object Users : Table("users") {
    val id    = long("id").autoIncrement()
    val name  = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
    val age   = integer("age").nullable()

    override val primaryKey = PrimaryKey(id)
}

カラムの型

Exposedには、一般的なSQL型用のファクトリ関数があります:

  • integer("col")、long("col")、short("col")
  • varchar("col", length)、text("col")
  • bool("col")、double("col")、decimal("col", precision, scale)
  • datetime("col")、date("col")、timestamp("col")
  • blob("col")、uuid("col")、binary("col", length)

NULL許容カラム

任意のカラムで.nullable()を呼び出すと、NULL値を許可できます。Kotlinの型もNULL許容になります(StringではなくString?になります):

object Products : Table("products") {
    val id          = long("id").autoIncrement()
    val name        = varchar("name", 200)
    val description = text("description").nullable()
    override val primaryKey = PrimaryKey(id)
}

デフォルト値

Kotlin側のデフォルト値(挿入前に適用)には.default(value)を、データベース側のSQLデフォルト値には.defaultExpression(expr)を使用します:

object Orders : Table("orders") {
    val id        = long("id").autoIncrement()
    val status    = varchar("status", 20).default("PENDING")
    val createdAt = datetime("created_at")
        .defaultExpression(CurrentDateTime)
    override val primaryKey = PrimaryKey(id)
}

インデックスと一意制約

カラムに直接通常のインデックスを設定するには.index()を、ユニークインデックスを設定するには.uniqueIndex()を呼び出します。複合インデックスには、Tableのindex()関数を使用します:

object Articles : Table("articles") {
    val id    = long("id").autoIncrement()
    val title = varchar("title", 300).index()
    val slug  = varchar("slug", 300).uniqueIndex()
    override val primaryKey = PrimaryKey(id)
}

外部キー

カラム間の外部キー制約を宣言するには.references()を使用します。参照先のカラムを渡し、必要に応じてonDeleteとonUpdateのアクションも指定します:

object Posts : Table("posts") {
    val id       = long("id").autoIncrement()
    val authorId = long("author_id").references(Users.id, onDelete = ReferenceOption.CASCADE)
    val title    = varchar("title", 300)
    override val primaryKey = PrimaryKey(id)
}

IdTableのバリエーション

DAO layerでは、通常のTableの代わりに型付きIDテーブルを使用します:

  • IntIdTable("name") — Int型の自動インクリメント主キー。名前はidです
  • LongIdTable("name") — Long型の自動インクリメント主キー
  • UUIDTable("name") — UUID主キー
object Users : LongIdTable("users") {
    val name  = varchar("name", 100)
    val email = varchar("email", 255).uniqueIndex()
}

複合主キー

複数のカラムをPrimaryKey()に渡すことで、複合主キーを定義します:

object UserRoles : Table("user_roles") {
    val userId = long("user_id").references(Users.id)
    val roleId = long("role_id").references(Roles.id)
    override val primaryKey = PrimaryKey(userId, roleId)
}

列挙型カラム

enumerationByName()またはenumeration()を使用して、Kotlinの列挙型の値を文字列または序数として保存します:

enum class Status { ACTIVE, INACTIVE, BANNED }

object Users : LongIdTable("users") {
    val name   = varchar("name", 100)
    val status = enumerationByName<Status>("status", 20)
}

スキーマ変更の適用

SchemaUtils.createMissingTablesAndColumns()を呼び出すと、既存のデータを削除せずに不足しているテーブルとカラムを追加できます。これは開発環境で安全に使用できるマイグレーションです。本番環境では、FlywayやLiquibaseなどのマイグレーションツールを使用します。

transaction {
    SchemaUtils.createMissingTablesAndColumns(Users, Posts, Orders)
}

クイックチェック

ExposedのTable DSLで、Posts.authorIdからUsers.idへの外部キーをどのように宣言しますか?

振り返り:Table DSLによるテーブル定義

重要なポイント:

  • テーブルはTable、LongIdTableなどを継承するobjectです
  • カラムにはvarchar、integer、long、bool、datetime、uuidなどがあります
  • .nullable()、.default()、.uniqueIndex()、.references()でカラムを変更します
  • 複合主キーにはPrimaryKey(col1, col2)を使用します
  • SchemaUtils.create()またはcreateMissingTablesAndColumns()でスキーマを適用します

よくある質問

「Table DSLによるテーブル定義」レッスンは無料ですか?

はい。「Table DSLによるテーブル定義」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「Table DSLによるテーブル定義」で何を学びますか?

カラム、主キー、外部キーを持つ型付きテーブルスキーマを定義します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Table DSLによるテーブル定義」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Exposedのセットアップ:データベース接続とTransaction DSL
  2. Table DSLによるテーブル定義
  3. Query DSLによるCRUD:insert、select、update、delete
  4. Exposed DAO:Entityクラスとリレーションシップ
← Kotlin Academyに戻る