0Pricing
Kotlin Academy · บทเรียน

การกำหนดตารางด้วย DSL ของ Table

กำหนดสคีมาตารางที่ระบุชนิด พร้อมคอลัมน์ คีย์หลัก และคีย์นอก

การกำหนดตารางด้วย DSL ของ Table เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

ออบเจ็กต์ตารางของ Exposed

ใน Exposed ตารางฐานข้อมูลจะแทนด้วย object แบบซิงเกิลตันของ Kotlin ซึ่งขยายความสามารถจาก Table (DSL สำหรับการสอบถาม) หรือ IntIdTable/LongIdTable/UUIDTable (ชั้น DAO) คำจำกัดความของคอลัมน์คือพร็อพเพอร์ตีของ 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)

คอลัมน์ที่เป็นค่าว่างได้

เรียก .nullable() กับคอลัมน์ใดก็ได้เพื่ออนุญาตให้มีค่า NULL ชนิดของ Kotlin จะกลายเป็นชนิดที่เป็นค่าว่างได้ (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)
}

ค่าเริ่มต้น

ใช้ .default(value) สำหรับค่าเริ่มต้นฝั่ง Kotlin (นำไปใช้ก่อนการแทรกข้อมูล) หรือใช้ .defaultExpression(expr) สำหรับค่าเริ่มต้น SQL ฝั่งฐานข้อมูล:

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() สำหรับดัชนีที่มีค่าไม่ซ้ำกันโดยตรงบนคอลัมน์ หากเป็นดัชนีแบบผสม ให้ใช้ฟังก์ชัน 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 ให้ใช้ตารางรหัสที่มีชนิดแทนการใช้ Table ธรรมดา:

  • 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)
}

คอลัมน์ชนิด Enum

จัดเก็บค่าชนิด enum ของ Kotlin เป็นสตริงหรือลำดับตัวเลขโดยใช้ enumerationByName() หรือ enumeration():

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)
}

ตรวจสอบความเข้าใจ

คุณประกาศคีย์ภายนอกจาก Posts.authorId ไปยัง Users.id ใน DSL ของ Table ใน Exposed ได้อย่างไร

ทบทวน: การกำหนดตารางด้วย DSL ของ Table

ประเด็นสำคัญ:

  • ตารางคือ object ที่ขยายความสามารถจาก Table, LongIdTable และอื่น ๆ
  • คอลัมน์: varchar, integer, long, bool, datetime, uuid และอื่น ๆ
  • .nullable(), .default(), .uniqueIndex() และ .references() ใช้ปรับแต่งคอลัมน์
  • คีย์หลักแบบผสม: PrimaryKey(col1, col2)
  • นำสคีมาไปใช้ด้วย SchemaUtils.create() หรือ createMissingTablesAndColumns()

คำถามที่พบบ่อย

บทเรียน “การกำหนดตารางด้วย DSL ของ Table” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดตารางด้วย DSL ของ Table” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดตารางด้วย DSL ของ Table”

กำหนดสคีมาตารางที่ระบุชนิด พร้อมคอลัมน์ คีย์หลัก และคีย์นอก คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดตารางด้วย DSL ของ Table” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม
  2. การกำหนดตารางด้วย DSL ของ Table
  3. CRUD ด้วย Query DSL: insert, select, update, delete
  4. Exposed DAO: คลาสเอนทิตีและความสัมพันธ์
← กลับไปที่ Kotlin Academy