ترحيلات قواعد البيانات في Swift (iOS/macOS): نظرة عامة على الأدوات والأمثلة
\n\nترحيلات قواعد البيانات هي عملية تغيير مخطط البيانات (الجداول، الفهارس، العلاقات) بطريقة محكومة دون فقدان المعلومات الموجودة بالفعل. في نظام Swift البيئي لمنصات Apple (iOS، macOS، watchOS، tvOS)، يستخدم المطورون عدة مناهج: من Core Data المدمج إلى المكتبات الخارجية مثل GRDB.swift و Fluent. في هذه المقالة، سنشرح الأدوات الرئيسية وإمكانياتها ونقدم أمثلة عملية على الكود.
\n\n1. Core Data والترحيلات (الخفيفة واليدوية)
\n\nCore Data هو إطار عمل Apple القياسي للعمل مع النموذج الكائني. تنقسم الترحيلات إلى نوعين:
\n- \n
- الترحيل الخفيف (Lightweight Migration) — تلقائي، إذا كانت التغييرات لا تتضمن تحويلات معقدة (إضافة سمات، حذف، إعادة تسمية مع نموذج تعيين). \n
- الترحيل اليدوي (Manual Migration) — مطلوب عندما تحتاج إلى تغيير أنواع البيانات، دمج الكيانات أو إجراء تحويلات مخصصة. \n
مثال على إعداد الترحيل الخفيف في Swift:
\nimport CoreData\n\nlazy var persistentContainer: NSPersistentContainer = {\n let container = NSPersistentContainer(name: "MyDataModel")\n let description = container.persistentStoreDescriptions.first\n description?.shouldMigrateStoreAutomatically = true\n description?.shouldInferMappingModelAutomatically = true\n container.loadPersistentStores { _, error in\n if let error = error {\n fatalError("خطأ في تحميل Core Data: \\(error)")\n }\n }\n return container\n}()\n\n\n2. GRDB.swift — مكتبة SQLite حديثة مع ترحيلات
\n\nGRDB.swift هي مكتبة قوية للعمل مع SQLite، وتقدم آلية ترحيل مدمجة. تسمح بإصدار مخطط قاعدة البيانات وتنفيذ التغييرات بشكل تسلسلي.
\n\nالتثبيت عبر Swift Package Manager:
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/groue/GRDB.swift.git", from: "6.0.0")\n]\n\n\nمثال على الترحيل باستخدام GRDB.swift:
\nimport GRDB\n\nvar migrator = DatabaseMigrator()\n\n// الترحيل 1: إنشاء جدول\nmigrator.registerMigration("v1_create_users") { db in\n try db.create(table: "users") { t in\n t.autoIncrementedPrimaryKey("id")\n t.column("name", .text).notNull()\n t.column("email", .text).unique()\n }\n}\n\n// الترحيل 2: إضافة عمود\nmigrator.registerMigration("v2_add_age") { db in\n try db.alter(table: "users") { t in\n t.add(column: "age", .integer).defaults(to: 0)\n }\n}\n\n// تطبيق الترحيلات عند بدء التطبيق\nlet dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")\ntry migrator.migrate(dbQueue)\n\n\n3. Fluent (Vapor) — ORM لـ Swift من جانب الخادم
\n\nFluent هو ORM جزء من إطار عمل Vapor (Swift من جانب الخادم لنظام macOS). يتم وصف الترحيلات في Fluent كفئات تطبق بروتوكول Migration.
مثال على الترحيل لـ Fluent 4:
\nimport Fluent\n\nstruct CreateUser: Migration {\n func prepare(on database: Database) -> EventLoopFuture<Void> {\n database.schema("users")\n .id()\n .field("name", .string, .required)\n .field("email", .string, .required).unique(on: "email")\n .create()\n }\n \n func revert(on database: Database) -> EventLoopFuture<Void> {\n database.schema("users").delete()\n }\n}\n\n// التسجيل في configure.swift\napp.migrations.add(CreateUser())\ntry app.autoMigrate().wait()\n\n\n4. مقارنة الأدوات
\n\n- \n
- Core Data — مناسب لتطبيقات Apple المرتبطة بالنموذج الكائني. الترحيلات غالباً تلقائية، لكن السيناريوهات المعقدة تتطلب نموذج تعيين (mapping model).