การกำหนดตารางด้วย 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ที่เพิ่มค่าอัตโนมัติและมีชื่อว่าidLongIdTable("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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม
- การกำหนดตารางด้วย DSL ของ Table
- CRUD ด้วย Query DSL: insert, select, update, delete
- Exposed DAO: คลาสเอนทิตีและความสัมพันธ์