مقدمة: لماذا يحتاج مطور Swift إلى قواعد البيانات؟
نادرًا ما تستغني التطبيقات الحديثة لنظامي iOS و macOS عن تخزين البيانات. سواء كانت قائمة مهام، أو ملف تعريف مستخدم، أو كتالوج منتجات — يجب تخزين البيانات واسترجاعها في مكان ما. توفر لغة Swift، باعتبارها اللغة الرئيسية للنظام البيئي لشركة Apple، أدوات قوية للعمل مع قواعد البيانات (DB). في هذه المقالة، سنشرح كيف يمكن للمطور المبتدئ الاتصال وتنفيذ عمليات CRUD (الإنشاء، القراءة، التحديث، الحذف) باستخدام نظامين شائعين: قاعدة البيانات العلائقية PostgreSQL وقاعدة البيانات الموجهة للوثائق MongoDB.
سنستخدم إطار العمل الخادمي Vapor (القائم على SwiftNIO) للعمل مع PostgreSQL، والمكتبة الشائعة MongoKitten لقاعدة بيانات MongoDB. كلا الخيارين ممتازان للواجهة الخلفية (Backend) بلغة Swift. إذا كنت مبتدئًا — فلا تقلق: كل الكود سيكون بسيطًا ومرفقًا بالشروحات.
1. PostgreSQL و Swift: كلاسيكيات قواعد البيانات العلائقية
PostgreSQL هي قاعدة بيانات علائقية قوية تدعم SQL. أفضل طريقة للتفاعل معها في Swift هي استخدام إطار العمل Vapor و ORM الخاص به Fluent. يتيح Fluent العمل مع الجداول كما لو كانت هياكل (Structs) عادية في Swift.
1.1. إعداد مشروع Vapor
أولاً، قم بتثبيت Vapor Toolbox وأنشئ مشروعًا:
brew install vaporvapor new MyAppcd MyAppأضف تبعية PostgreSQL في ملف Package.swift:
dependencies: [ .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent.git", from: "4.0.0"), .package(url: "https://github.com/vapor/fluent-postgres-driver.git", from: "2.0.0")]1.2. النموذج (Model) والترحيل (Migration)
لنقم بإنشاء نموذج بسيط User:
import Fluentimport Vapor
final class User: Model, Content { static let schema = "users" @ID(key: .id) var id: UUID? @Field(key: "name") var name: String @Field(key: "email") var email: String init() { } init(id: UUID? = nil, name: String, email: String) { self.id = id self.name = name self.email = email }}الآن، الترحيل (Migration) لإنشاء الجدول:
struct CreateUser: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { database.schema("users") .id() .field("name", .string, .required) .field("email", .string, .required) .create() } func revert(on database: Database) -> EventLoopFuture<Void> { database.schema("users").delete() }}قم بتسجيل الترحيل في ملف configure.swift:
app.migrations.add(CreateUser())1.3. عمليات CRUD
إنشاء سجل (Create):
let user = User(name: "إيفان", email: "ivan@example.com")try await user.save(on: database)القراءة (Read):
let users = try await User.query(on: database).all()let user = try await User.find(id, on: database)التحديث (Update):
guard let user = try await User.find(id, on: database) else { return }user.name = "اسم جديد"try await user.update(on: database)الحذف (Delete):
guard let user = try await User.find(id, on: database) else { return }try await user.delete(on: database)يقوم Fluent تلقائيًا بتوليد استعلامات SQL، مما يبسط الحياة بشكل كبير للمبتدئين.
2. MongoDB و Swift: مرونة NoSQL
MongoDB هي قاعدة بيانات وثائقية، حيث يتم تخزين البيانات بتنسيق BSON (JSON ثنائي). بالنسبة لـ Swift، نستخدم المكتبة MongoKitten — وهي مكتبة ناضجة ومدعومة بنشاط.