تعريف الجداول باستخدام Table DSL
عرّف مخططات جداول ذات أنواع باستخدام الأعمدة والمفاتيح الأساسية والخارجية.
تعريف الجداول باستخدام Table DSL درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
كائنات جداول Exposed
في Exposed، تُمثَّل جداول قاعدة البيانات على هيئة كائنات Kotlin مفردة object تمتد من Table (Query DSL) أو IntIdTable/LongIdTable/UUIDTable (DAO layer). وتكون تعريفات الأعمدة على هيئة خصائص 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() على Table:
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 العادي:
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)
}أعمدة التعدادات
خزّن قيم تعداد 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 في Table DSL الخاصة بـ Exposed؟
مراجعة: تعريف الجداول باستخدام Table DSL
أهم النقاط:
- الجداول هي كائنات
objectتمتد منTableأوLongIdTableوغيرها - الأعمدة:
varcharوintegerوlongوboolوdatetimeوuuidوغيرها - تعدّل
.nullable()و.default()و.uniqueIndex()و.references()الأعمدة - المفاتيح الأساسية المركبة:
PrimaryKey(col1, col2) - طبّق المخطط باستخدام
SchemaUtils.create()أوcreateMissingTablesAndColumns()
الأسئلة الشائعة
هل درس «تعريف الجداول باستخدام Table DSL» مجاني؟
نعم — نص درس «تعريف الجداول باستخدام Table DSL» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعريف الجداول باستخدام Table DSL»؟
عرّف مخططات جداول ذات أنواع باستخدام الأعمدة والمفاتيح الأساسية والخارجية. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تعريف الجداول باستخدام Table DSL»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إعداد Exposed: اتصال قاعدة البيانات وDSL للمعاملات
- تعريف الجداول باستخدام Table DSL
- عمليات CRUD باستخدام Query DSL: insert وselect وupdate وdelete
- Exposed DAO: أصناف Entity والعلاقات