गो माइग्रेट ट्यूटोरियल

1. गो माइग्रेट का अवलोकन

गो माइग्रेट एक टूल है जो गो भाषा में लिखा डेटाबेस माइग्रेशन को प्रबंधित करने के लिए है। इसे गो परियोजनाओं के लिए एक कमांड-लाइन इंटरफ़ेस (CLI) के रूप में या गो परियोजनाओं के लिए एक पुस्तकालय के रूप में आयात किया जा सकता है। गो माइग्रेट, विभिन्न डेटाबेस ड्राइवर और माइग्रेशन स्रोत का समर्थन करता है और सही क्रम में उन्हें डेटाबेस में लागू कर सकता है।

2. संस्करण

गो माइग्रेट कई संस्करणों का समर्थन करता है, जैसे:

  • मास्टर: नवीनतम संस्करण, जिसमें नई सुविधाएँ और बग ठीक किए गए हैं
  • v4: स्थिर संस्करण, उत्पादन वातावरण के लिए उपयुक्त
  • v3: अब समर्थन नहीं किया जाता है और उपयोग नहीं किया जाना चाहिए

3. स्थापना

गो माइग्रेट का उपयोग करने के लिए, आपको गो पैकेज को स्थापित करना होगा। स्थापना के लिए निम्नलिखित कमांड चलाएं:

go get -u -d github.com/golang-migrate/migrate/v4
cd $GOPATH/src/github.com/golang-migrate/migrate/v4

3. गो माइग्रेट का उपयोग

गो माइग्रेट का उपयोग CLI के माध्यम से या गो परियोजनाओं में पुस्तकालय के रूप में किया जा सकता है।

3.0. डेटाबेस कनेक्शन URL

CLI या गो कोड का उपयोग करते समय, डेटाबेस URL को डेटाबेस से कनेक्ट करने के लिए कॉन्फ़िगर करना होता है।

URL प्रारूप:

dbdriver://username:password@host:port/dbname?param1=true&param2=false

यह URL डेटाबेस से कनेक्ट करने के लिए उपयोग किया जाने वाला डेटाबेस कनेक्शन URL है और कनेक्शन पैरामीटर्स को निर्दिष्ट करने के लिए है। यहां हर भाग के लिए विवरण दिया गया है:

  1. dbdriver://: यह डेटाबेस ड्राइवर के लिए प्रोटोकॉल पहचानक है जो उपयोग करने वाले डेटाबेस ड्राइवर को निर्दिष्ट करने के लिए है, जैसे, mysql।
  2. username:password: यह प्रमाणीकरण के लिए उपयोग की जाने वाली उपयोक्ता नाम और पासवर्ड है। सामान्यत: उपयोक्ता नाम और पासवर्ड को आमतौर पर एक विरामचिन्ह (:) द्वारा अलग किया जाता है।
  3. @: यह प्रतीक उपयोक्ता नाम और पासवर्ड को मेजबान के नाम और पोर्ट से अलग करने के लिए उपयोग किया जाता है।
  4. host:port: यह डेटाबेस सर्वर का होस्टनाम और पोर्ट संख्या है। होस्टनाम डेटाबेस सर्वर का आईपी पता या डोमेन नाम होता है, और पोर्ट संख्या डेटाबेस सर्वर का सुनवाई जा रहा है।
  5. /dbname: यह कनेक्ट करने के लिए डेटाबेस का नाम है।
  6. ?param1=true&param2=false: यह भाग अतिरिक्त कनेक्शन पैरामीटर्स को निर्दिष्ट करने के लिए उपयोग किए जाते हैं। इस उदाहरण में, दो पैरामीटर हैं।

इन पैरामीटरों को डेटाबेस ड्राइवर और डेटाबेस सर्वर के विशिष्ट आवश्यकताओं के अनुसार सेट किया जा सकता है ताकि कनेक्शन की विशिष्ट गुणवत्ता या व्यवहार को कॉन्फ़िगर किया जा सके।

पोस्टग्रेस कनेक्शन पैरामीटर

postgres://postgres:password@localhost:5432/example?sslmode=disable

SQLite कनेक्शन पैरामीटर

sqlite3://path/to/database?query

MongoDB कनेक्शन पैरामीटर

mongodb://user:password@host:port/dbname?query

3.1 CLI उपयोग

3.1.1 मूल उपयोग

CLI का उपयोग करने के लिए, निम्नलिखित कमांड चलाएं:

migrate -source file://path/to/migrations -database postgres://localhost:5432/database up 2

इस कमांड से निर्दिष्ट स्रोत से माइग्रेशन दिए गए डेटाबेस में लागू किया जाता है। संख्या "2" दिए गए माइग्रेशनों को लागू करने के लिए है।

3.1.2 डॉकर उपयोग

गो माइग्रेट को डॉकर के साथ भी उपयोग किया जा सकता है। निम्नलिखित कमांड चलाएं:

docker run -v {{ migration dir }}:/migrations --network host migrate/migrate -path=/migrations/ -database postgres://localhost:5432/database up 2

यह कमांड गो माइग्रेट को डॉकर कंटेनर में चलाता है और निर्दिष्ट स्रोत से माइग्रेशन दिए गए डेटाबेस में लागू होता है।

3.2 अपने Go प्रोजेक्ट में उपयोग करना

Go Migrate को अपने Go प्रोजेक्ट में उपयोग करने के लिए, आपको आवश्यक पैकेज और लाइब्रेरीज़ को इम्पोर्ट करना होगा। यहां एक उदाहरण है:

import (
    "github.com/golang-migrate/migrate/v4"
    _ "github.com/golang-migrate/migrate/v4/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/source/github"
)

func main() {
    m, err := migrate.New(
        "github://mattes:personal-access-token@mattes/migrate_test",
        "postgres://localhost:5432/database?sslmode=enable")
    m.Steps(2)
}

यह कोड निर्दिष्ट स्रोत और डेटाबेस के साथ Go Migrate को आरंभ करता है, और फिर Steps विधि का उपयोग करके 2 माइग्रेशन लागू करता है।

यदि आपको मौजूदा डेटाबेस क्लाइंट का उपयोग करना है, तो कृपया निम्नलिखित उदाहरण का संदर्भ लें:

import (
    "database/sql"
    _ "github.com/lib/pq"
    "github.com/golang-migrate/migrate/v4"
    "github.com/golang-migrate/migrate/v4/database/postgres"
    _ "github.com/golang-migrate/migrate/v4/source/file"
)

func main() {
    db, err := sql.Open("postgres", "postgres://localhost:5432/database?sslmode=enable")
    driver, err := postgres.WithInstance(db, &postgres.Config{})
    m, err := migrate.NewWithDatabaseInstance(
        "file:///migrations",
        "postgres", driver)
    m.Up()
}

यह कोड आवश्यक पैकेज इम्पोर्ट करता है और sql पैकेज का उपयोग करके डेटाबेस क्लाइंट को आरंभ करता है। फिर, NewWithDatabaseInstance विधि का उपयोग करके नए Go Migrate इंस्टेंस को बनाता है, स्रोत और डेटाबेस ड्राइवर को निर्दिष्ट करता है। अंत में, Up विधि का उपयोग करके माइग्रेशन लागू करता है।

4. समर्थित डेटाबेस ड्राइवर

Go Migrate कमांड कई डेटाबेस ड्राइवर का समर्थन करता है, जैसे:

  • PostgreSQL
  • PGX v4
  • PGX v5
  • Redshift
  • Ql
  • Cassandra
  • SQLite
  • SQLite3
  • SQLCipher
  • MySQL/MariaDB
  • Neo4j
  • MongoDB
  • CrateDB
  • Shell
  • Google Cloud Spanner
  • CockroachDB
  • YugabyteDB
  • ClickHouse
  • Firebird
  • MS SQL Server

5. समर्थित माइग्रेशन स्रोत

Go Migrate कमांड कई माइग्रेशन स्रोत का समर्थन करता है, जैसे:

  • फाइल सिस्टम: स्थानीय फ़ाइल सिस्टम से माइग्रेशन पढ़ें।
  • io/fs: गो io/fs पैकेज का उपयोग करके माइग्रेशन पढ़ें।
  • Go-Bindata: jteeuwen/go-bindata पैकेज का उपयोग करके संलग्न बाइनरी डेटा से माइग्रेशन पढ़ें।
  • pkger: markbates/pkger पैकेज का उपयोग करके संलग्न बाइनरी डेटा से माइग्रेशन पढ़ें।
  • GitHub: दूरस्थ GitHub रिपॉजिटरी से माइग्रेशन पढ़ें।
  • GitHub Enterprise: दूरस्थ GitHub Enterprise रिपॉजिटरी से माइग्रेशन पढ़ें।
  • Bitbucket: दूरस्थ Bitbucket रिपॉजिटरी से माइग्रेशन पढ़ें।
  • Gitlab: दूरस्थ Gitlab रिपॉजिटरी से माइग्रेशन पढ़ें।
  • AWS S3: Amazon Web Services S3 से माइग्रेशन पढ़ें।
  • Google Cloud Storage: Google Cloud Platform Storage से माइग्रेशन पढ़ें।

आपके प्रोजेक्ट आवश्यकताओं के आधार पर, आप उपरोक्त समर्थित फ़ाइल संग्रह स्रोतों में डेटाबेस माइग्रेशन फ़ाइलें संग्रहित कर सकते हैं।

6. माइग्रेशन फ़ाइलें

Go Migrate में माइग्रेशन फ़ाइलों में विशेष फ़ाइल नाम और सामग्री स्वरूप होता है।

6.1 माइग्रेशन फ़ाइल नाम स्वरूप

प्रत्येक माइग्रेशन में "ऊपर" माइग्रेशन फ़ाइल और संबंधित "नीचे" माइग्रेशन फ़ाइल होती है। माइग्रेशन फ़ाइल नामों को निम्नलिखित स्वरूप का पालन करना चाहिए:

{version}_{title}.up.{extension}
{version}_{title}.down.{extension}

version एक अद्वितीय संख्या है जो माइग्रेशन लागू करने की क्रम में प्रतिनिधित्व करती है। title एक वैकल्पिक माइग्रेशन का विवरण है। extension उपयोग किए जाने वाले डेटाबेस सिस्टम पर निर्भर करती है (उदाहरण के लिए, SQL वेरिएंट्स के लिए, .sql का उपयोग करें)।

6.2 माइग्रेशन सामग्री स्वरूप

माइग्रेशन फ़ाइलों की सामग्री डेटाबेस सिस्टम पर निर्भर करती है, आमतौर पर इसमें सीधे SQL लिखना शामिल होता है।

उदाहरण के रूप में, निम्नलिखित दो माइग्रेशन फ़ाइलें हैं:

  • 000001_create_users_table.up.sql
  • 000001_create_users_table.down.sql

माइग्रेशन फ़ाइल 000001_create_users_table.up.sql

CREATE TABLE IF NOT EXISTS users(
   user_id serial PRIMARY KEY,
   username VARCHAR (50) UNIQUE NOT NULL,
   password VARCHAR (50) NOT NULL,
   email VARCHAR (300) UNIQUE NOT NULL
);

माइग्रेशन फ़ाइल 000001_create_users_table.down.sql, नीचे की फ़ाइल पिछले ऑपरेशन को पूर्ववत करने के लिए प्रमुख रूप से उपयुक्त होती है, सामान्यत: रोलबैक उद्देश्यों के लिए।

DROP TABLE IF EXISTS users;

6.3 पलटावणीता की संभावना

प्रतिलिपि पारीक्रिया लिखना सर्वोत्तम प्रथा मानी जाती है। इसका मतलब है कि ऊपर और नीचे की प्रतिलिपियों को किसी भी संस्करण पर चलाया जा सकना चाहिए, बनावट को पुनः सृजित करते हुए और डेटाबेस स्थिति को साफ करते हुए।

पलटावणी सुनिश्चित करने के लिए, प्रत्येक पलायन केवला का एक संबंधित "ऊपर" और "नीचे" पलायन फ़ाइल होनी चाहिए। "ऊपर" पलायन फ़ाइल में पलायन लागू करने की क्रियाएँ होती हैं, जबकि "नीचे" पलायन फ़ाइल में पलायन को अनकरने की क्रियाएँ होती हैं।

7. MySQL का उपयोग

Go Migrate MySQL डेटाबेस के लिए समर्थन प्रदान करता है। MySQL डेटाबेस से कनेक्ट करने के लिए, डेटाबेस URL निम्नलिखित प्रारूप में होना चाहिए:

mysql://user:password@tcp(host:port)/dbname?query

यूआरएल में पूछताछ पैरामीटर शामिल किए जा सकते हैं, जैसे पलायन तालिका का नाम, TLS पैरामीटर, आदि। पूरी पूछताछ पैरामीटरों के लिए, कृपया Go Migrate MySQL दस्तावेज़ीकरण का संदर्भ देखें।

7.1 URL पूछताछ पैरामीटर

  • x-प्रवासन-सारणी: पलायन तालिका का नाम।
  • x-नहीं-लॉक: GET_LOCK/RELEASE_LOCK कथनों को छोड़ने के लिए true पर सेट करें। बहु-मास्टर MySQL संस्करणों के लिए उपयोगी।
  • x-कथन-समय-सीमा: निर्धारित संख्या के मिलीसेकंड से अधिक किसी भी कथन को रद्द कर देता है।
  • dbname: कनेक्ट करने के लिए डेटाबेस का नाम।
  • user: लॉग इन करने के लिए उपयोगकर्ता।
  • password: उपयोगकर्ता का पासवर्ड।
  • host: कनेक्ट होने के लिए होस्ट।
  • port: बाइंड करने के लिए पोर्ट।
  • tls: TLS/SSL एनक्रिप्शन कनेक्शन पैरामीटर।
  • x-tls-ca: सीए (सर्टिफ़िकेट प्राधिकार) फ़ाइल का स्थान।
  • x-tls-cert: क्लाइंट सर्टिफ़िकेट फ़ाइल का स्थान।
  • x-tls-key: निजी कुंजी फ़ाइल का स्थान।
  • x-tls-अमान्य-स्किप-सत्यापित: क्या SSL का उपयोग करना है या नहीं।

7.2 मौजूदा ग्राहकों के साथ उपयोग

यदि आप Go Migrate को मौजूदा MySQL ग्राहक के साथ उपयोग करना चाहते हैं, तो सुनिश्चित करें कि क्लाइंट बनाने के समय multiStatements=true पैरामीटर का उपयोग करें। यहां एक उदाहरण है:

package main

import (
    "database/sql"
    
    _ "github.com/go-sql-driver/mysql"
    "github.com/golang-migrate/migrate/v4"
    "github.com/golang-migrate/migrate/v4/database/mysql"
    _ "github.com/golang-migrate/migrate/v4/source/file"
)

func main() {
    db, _ := sql.Open("mysql", "user:password@tcp(host:port)/dbname?multiStatements=true")
    driver, _ := mysql.WithInstance(db, &mysql.Config{})
    m, _ := migrate.NewWithDatabaseInstance(
        "file:///migrations",
        "mysql", 
        driver,
    )
    
    m.Steps(2)
}

यह कोड आवश्यक पैकेज आयात करता है, एक MySQL डेटाबेस ग्राहक बनाता है, और डेटाबेस उदाहरण के साथ Go Migrate को प्रारंभ करता है। फिर वह Steps विधि का उपयोग करके दो पलायन लागू करता है।