ترحيلات قواعد البيانات في Kotlin: دليل شامل للأدوات والمناهج
إدارة تغييرات مخطط قاعدة البيانات هي إحدى المهام الرئيسية عند تطوير أي تطبيق. في نظام Kotlin البيئي، توجد عدة حلول ناضجة تتيح أتمتة هذه العملية. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية: الأدوات المدمجة لـ ORM Exposed، و Flyway الكلاسيكي، و Liquibase القوي. ستتعلم كيفية دمجها في مشروع Kotlin وأي أداة تختارها لمهام محددة.
1. لماذا نحتاج إلى الترحيلات؟
التنفيذ اليدوي لبرامج SQL النصية في بيئات مختلفة (بيئة التطوير المحلية، مرحلة الاختبار، الإنتاج) يؤدي حتماً إلى عدم تزامن المخطط. تحل الترحيلات هذه المشكلة من خلال توفير:
- إصدارات لتغييرات قاعدة البيانات
- تطبيق تلقائي للبرامج النصية الجديدة عند بدء التطبيق
- إمكانية التراجع (rollback) إلى الإصدار السابق
- العمل الجماعي دون تعارضات في المخطط
2. Exposed: دعم أصلي للترحيلات
Exposed هو ORM خفيف الوزن من JetBrains، مكتوب بلغة Kotlin. بدءاً من الإصدار 0.41.0، توفر المكتبة آلية ترحيل خاصة بها تتناسب تماماً مع نظام Kotlin البيئي.
التثبيت
// build.gradle.ktsimplementation("org.jetbrains.exposed:exposed-core:0.55.0")implementation("org.jetbrains.exposed:exposed-dao:0.55.0")implementation("org.jetbrains.exposed:exposed-migrations:0.55.0")إنشاء ترحيل
كل ترحيل هو كلاس يرث من VoidDatabaseMigration:
import org.jetbrains.exposed.sql.transactions.transactionimport org.jetbrains.exposed.sql.SchemaUtilsimport org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.migrations.VoidDatabaseMigration
object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 255) override val primaryKey = PrimaryKey(id)}
class V1__CreateUsersTable : VoidDatabaseMigration() { override fun migrate() { transaction { SchemaUtils.create(Users) } }}
class V2__AddEmailColumn : VoidDatabaseMigration() { override fun migrate() { transaction { SchemaUtils.addColumn(Users, Users.varchar("email", 255)) } }}تشغيل الترحيلات
import org.jetbrains.exposed.migrations.ExposedMigrationUtilsimport javax.sql.DataSource
fun runMigrations(dataSource: DataSource) { ExposedMigrationUtils.runMigrations( dataSource = dataSource, migrationsPackage = "com.example.migrations" )}الإيجابيات: أسلوب Kotlin بالكامل، لا توجد ملفات SQL، أسماء أعمدة محددة النوع.
السلبيات: الارتباط بـ Exposed، لا يوجد متتبع بصري، عدم وجود تراجع (rollback) "خارج الصندوق".
3. Flyway: البساطة والموثوقية
Flyway هو الأداة الأكثر شيوعاً للترحيلات في عالم JVM. يعمل مع أي قواعد بيانات ولا يعتمد على ORM. في Kotlin، يُستخدم عبر SDK الرسمي أو إضافة Gradle.
التوصيل
// build.gradle.ktsimplementation("org.flywaydb:flyway-core:10.20.0")// بالنسبة لـ PostgreSQL، أضف المشغل:implementation("org.postgresql:postgresql:42.7.4")هيكل الترحيلات
يستخدم Flyway ملفات SQL بتسمية محددة:
db/migration/ V1__create_users.sql V2__add_email_column.sql V3__add_role_column.sqlمثال على ترحيل SQL (V1__create_users.sql)
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE);التكامل مع Kotlin
import org.flywaydb.core.Flywayimport javax.sql.DataSou