مقدمة في العمل مع قواعد البيانات باستخدام Swift
لم يعد Swift لغة مخصصة فقط لتطوير التطبيقات المحمولة. مع ظهور أطر العمل الخادمية مثل Vapor و Kitura، أصبح Swift أداة متكاملة لإنشاء حلول backend. الجانب الأساسي لأي نظام خادم هو العمل مع قواعد البيانات. في هذه المقالة، سنستعرض كيفية الاتصال والتفاعل مع نظامين شائعين لإدارة قواعد البيانات: PostgreSQL العلائقية و MongoDB الموجهة للمستندات. ستتعرف على المكتبات التي يجب استخدامها، وكيفية إعداد الاتصال وتنفيذ عمليات CRUD الأساسية باستخدام Swift الخالص.
PostgreSQL في Swift: الإعداد والعمليات الأساسية
PostgreSQL هي واحدة من أكثر قواعد البيانات العلائقية موثوقية. للعمل معها في Swift، توجد عدة مكتبات، لكن الأكثر شهرة هي PostgresNIO — وهو مشغل غير متزامن مبني على SwiftNIO. إذا كنت تستخدم إطار العمل Vapor، فإن العمل مع PostgreSQL يصبح أسهل من خلال ORM Fluent.
الاتصال بـ PostgreSQL عبر PostgresNIO
لنبدأ بإضافة التبعية. في ملف Package.swift، أضف:
// swift-tools-version:5.7
import PackageDescription
let package = Package(
name: "MyApp",
dependencies: [
.package(url: "https://github.com/vapor/postgres-nio.git", from: "1.18.0")
],
targets: [
.target(name: "MyApp", dependencies: [
.product(name: "PostgresNIO", package: "postgres-nio")
])
]
)
مثال على الاتصال وتنفيذ استعلام SELECT بسيط:
import PostgresNIO
import NIOCore
import NIOPosix
let eventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 1)
let config = PostgresConnection.Configuration(
host: "localhost",
port: 5432,
username: "myuser",
password: "mypassword",
database: "mydb",
tls: .disable
)
let connection = try await PostgresConnection.connect(
on: eventLoopGroup.next(),
configuration: config
)
let rows = try await connection.query("SELECT id, name FROM users LIMIT 5;", logger: nil)
for try await row in rows {
let id: Int = try row["id"].decode(Int.self)
let name: String = try row["name"].decode(String.self)
print("User: \(id) - \(name)")
}
العمل مع Vapor Fluent (ORM)
يوفر Fluent واجهة برمجة تطبيقات عالية المستوى للعمل مع PostgreSQL. سيكون نموذج المستخدم على النحو التالي:
import Fluent
import 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
}
}
// إنشاء سجل
let user = User(name: "إيفان", email: "ivan@example.com")
try await user.save(on: req.db)
// استعلام جميع المستخدمين
let users = try await User.query(on: req.db).all()
MongoDB في Swift: العمل مع المستندات
MongoDB هي قاعدة بيانات NoSQL تخزن البيانات بتنسيق BSON (JSON ثنائي). بالنسبة لـ Swift، يوجد مشغل رسمي MongoSwift تم تطويره بواسطة MongoDB Inc. وهو يدعم العمليات غير المتزامنة والوضع المتزامن.
تثبيت والاتصال بـ MongoSwift
أضف التبعية في ملف Package.swift:
dependencies: [
.package(url: "https://github.com/mongodb/mongo-swift-driver.git", from: "1.3.0")
],
targets: [
.target(name: "MyApp", dependencies: [
.product(name: "MongoSwift", package: "mongo-swift-driver")
])
]
مثال على الاتصال بـ MongoDB المحلي وإدراج مستند:
import MongoSwift
let client = try MongoClient("mongodb://localhost:27017")
let db = client.db("mydatabase")
let collection = db.collection("users")
// إدراج مستند
let document: Document = ["name": "أحمد", "email": "ahmed@example.com"]
let result = try collection.insertOne(document)
print("تم إدراج المستند بالمعرف: \(result?.insertedID ?? "غير معروف")")
// استعلام المستندات
let query: Document = [:]
let documents = try collection.find(query)
for doc in documents {
print(doc)
}
```