Kotlin में डेटाबेस माइग्रेशन: टूल्स और व्यावहारिक उदाहरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Kotlin में डेटाबेस माइग्रेशन: बिना सिरदर्द के स्कीमा प्रबंधन

Kotlin में डेवलपमेंट करते समय, खासकर JVM के साथ, देर-सबेर डेटाबेस स्ट्रक्चर को डेवलपर्स, टेस्ट और प्रोडक्शन सर्वरों के बीच सिंक्रोनाइज़ करने की समस्या आती है। SQL स्क्रिप्ट्स को मैन्युअली चलाने से डीसिंक्रोनाइज़ेशन और एरर होते हैं। इसका समाधान है डेटाबेस माइग्रेशन। यह स्कीमा में बदलावों (टेबल बनाना, कॉलम जोड़ना, इंडेक्स और ट्रिगर) को वर्शन करने का एक ऑटोमेटेड तरीका है।

इस आर्टिकल में हम Kotlin के तीन लोकप्रिय टूल्स पर चर्चा करेंगे: Flyway, Liquibase और Exposed का बिल्ट-इन मैकेनिज़्म। आप सीखेंगे कि इन्हें अपने प्रोजेक्ट में कैसे इंटीग्रेट करें, माइग्रेशन कैसे लिखें और सामान्य समस्याओं से कैसे बचें।

Flyway: सरलता और वर्शनिंग

Flyway JVM इकोसिस्टम में माइग्रेशन का सबसे लोकप्रिय टूल है। यह Kotlin, Java और Groovy को सपोर्ट करता है। काम करने का तरीका: आप SQL स्क्रिप्ट्स (या Java/Kotlin क्लासेज़) लिखते हैं, और Flyway flyway_schema_history टेबल की मदद से ट्रैक करता है कि कौन सी स्क्रिप्ट पहले से लागू हो चुकी हैं।

Gradle (Kotlin DSL) में कनेक्शन:

dependencies {
    implementation("org.flywaydb:flyway-core:9.22.3")
    // PostgreSQL के लिए
    implementation("org.flywaydb:flyway-database-postgresql:9.22.3")
}

माइग्रेशन का उदाहरण V1__create_users.sql:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

CREATE INDEX idx_users_email ON users(email);

Kotlin कोड से चलाना:

import org.flywaydb.core.Flyway

fun main() {
    val flyway = Flyway.configure()
        .dataSource("jdbc:postgresql://localhost:5432/mydb", "user", "pass")
        .load()
    flyway.migrate()
}

फायदे:

  • न्यूनतम कॉन्फ़िगरेशन
  • पेड वर्शन में रोलबैक (undo) का सपोर्ट
  • किसी भी SQL के साथ काम करता है

नुकसान:

  • बिल्ट-इन स्कीमा वैलिडेशन नहीं है
  • ब्रांचिंग मैनेज करना मुश्किल

Liquibase: लचीलापन और डिक्लेरेटिव अप्रोच

Liquibase दो तरीके प्रदान करता है: बदलावों को XML, YAML, JSON या सीधे SQL में डिस्क्राइब किया जा सकता है। Kotlin प्रोजेक्ट्स के लिए YAML फ़ॉर्मेट सुविधाजनक है - यह पढ़ने में आसान और आसानी से वर्शन किया जा सकता है।

Gradle में जोड़ना:

dependencies {
    implementation("org.liquibase:liquibase-core:4.24.0")
}

changelog फ़ाइल का उदाहरण db.changelog-master.yaml:

databaseChangeLog:
  - changeSet:
      id: 1
      author: developer
      changes:
        - createTable:
            tableName: users
            columns:
              - column:
                  name: id
                  type: BIGINT
                  autoIncrement: true
                  constraints:
                    primaryKey: true
              - column:
                  name: username
                  type: VARCHAR(50)
                  constraints:
                    nullable: false
                    unique: true
              - column:
                  name: email
                  type: VARCHAR(100)
        - createIndex:
            indexName: idx_users_email
            tableName: users
            columns:
              - column:
                  name: email

Kotlin से चलाना:

import liquibase.Liquibase
import liquibase.database.jvm.JdbcConnection
import liquibase.resource.ClassLoaderResourceAccessor
import java.sql.DriverManager

fun runMigrations() {
    val connection = DriverManager.getConnection(
        "jdbc:postgresql://localhost:5432/mydb", "user", "pass"
    )
    val database = DatabaseFactory.getInstance()
        .findCorrectDatabaseImplementation(JdbcConnection(connection))
    val liquibase = Liquibase("db.changelog-master.yaml", ClassLoaderResourceAccessor(), database)
    liquibase.update("")
}

अनुशंसाएँ