Swift में डेटाबेस माइग्रेशन (iOS/macOS): टूल्स और उदाहरणों के साथ गाइड
डेटाबेस माइग्रेशन का मतलब है डेटा स्कीमा (टेबल, इंडेक्स, रिलेशनशिप) को नियंत्रित तरीके से बदलना, बिना मौजूदा डेटा को खोए। Apple प्लेटफॉर्म्स (iOS, macOS, watchOS, tvOS) के लिए Swift इकोसिस्टम में डेवलपर्स कई तरीके अपनाते हैं: बिल्ट-इन Core Data से लेकर GRDB.swift और Fluent जैसी थर्ड-पार्टी लाइब्रेरीज़ तक। इस आर्टिकल में हम मुख्य टूल्स, उनकी क्षमताओं और प्रैक्टिकल कोड उदाहरणों पर चर्चा करेंगे।
1. Core Data और माइग्रेशन (लाइटवेट और मैन्युअल)
Core Data ऑब्जेक्ट मॉडल के साथ काम करने के लिए Apple का स्टैंडर्ड फ्रेमवर्क है। माइग्रेशन दो प्रकार के होते हैं:
- लाइटवेट माइग्रेशन (Lightweight Migration) — ऑटोमैटिक, जब बदलाव जटिल ट्रांसफॉर्मेशन (जैसे एट्रीब्यूट जोड़ना, हटाना, मैपिंग मॉडल के साथ नाम बदलना) से संबंधित न हों।
- मैन्युअल माइग्रेशन (Manual Migration) — तब जरूरी होता है जब डेटा टाइप बदलना हो, एंटिटीज़ को मर्ज करना हो या कस्टम ट्रांसफॉर्मेशन करना हो।
Swift में लाइटवेट माइग्रेशन सेटअप का उदाहरण:
import CoreData
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "MyDataModel")
let description = container.persistentStoreDescriptions.first
description?.shouldMigrateStoreAutomatically = true
description?.shouldInferMappingModelAutomatically = true
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Core Data लोड करने में त्रुटि: \(error)")
}
}
return container
}()
2. GRDB.swift — माइग्रेशन के साथ आधुनिक SQLite लाइब्रेरी
GRDB.swift SQLite के साथ काम करने के लिए एक शक्तिशाली लाइब्रेरी है, जिसमें बिल्ट-इन माइग्रेशन मैकेनिज्म है। यह डेटाबेस स्कीमा को वर्जन करने और क्रमिक रूप से बदलाव करने की सुविधा देता है।
Swift Package Manager के ज़रिए इंस्टॉलेशन:
// Package.swift
dependencies: [
.package(url: "https://github.com/groue/GRDB.swift.git", from: "6.0.0")
]
GRDB.swift के साथ माइग्रेशन का उदाहरण:
import GRDB
var migrator = DatabaseMigrator()
// माइग्रेशन 1: टेबल बनाना
migrator.registerMigration("v1_create_users") { db in
try db.create(table: "users") { t in
t.autoIncrementedPrimaryKey("id")
t.column("name", .text).notNull()
t.column("email", .text).unique()
}
}
// माइग्रेशन 2: कॉलम जोड़ना
migrator.registerMigration("v2_add_age") { db in
try db.alter(table: "users") { t in
t.add(column: "age", .integer).defaults(to: 0)
}
}
// ऐप शुरू होने पर माइग्रेशन लागू करना
let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
try migrator.migrate(dbQueue)
3. Fluent (Vapor) — सर्वर-साइड Swift के लिए ORM
Fluent एक ORM है जो Vapor फ्रेमवर्क (macOS के लिए सर्वर-साइड Swift) का हिस्सा है। Fluent में माइग्रेशन को क्लासेज़ के रूप में लिखा जाता है जो Migration प्रोटोकॉल को लागू करते हैं।
Fluent 4 के लिए माइग्रेशन का उदाहरण:
import Fluent
struct CreateUser: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema("users")
.id()
.field("name", .string, .required)
.field("email", .string, .required).unique(on: "email")
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("users").delete()
}
}
// configure.swift में रजिस्ट्रेशन
app.migrations.add(CreateUser())
try app.autoMigrate().wait()
4. टूल्स की तुलना
- Core Data — Apple ऐप्स के लिए उपयुक्त, जो ऑब्जेक्ट मॉडल से जुड़े हों। माइग्रेशन अक्सर ऑटोमैटिक होते हैं, लेकिन जटिल परिदृश्यों में मैपिंग मॉडल की जरूरत होती है।
- GRDB.swift — उन प्रोजेक्ट्स के लिए आदर्श जहां SQLite पर सीधा नियंत्रण चाहिए। माइग्रेशन साफ और वर्जन-आधारित होते हैं।
- Fluent (Vapor) — सर्वर-साइड Swift ऐप्स के लिए सबसे अच्छा विकल्प, खासकर जब Vapor के साथ काम कर रहे हों।