Go Migrate Öğretici

1. Go Migrate Genel Bakış

Go Migrate, Go dilinde yazılmış bir veritabanı göç yönetimi aracıdır. Komut satırı arayüzü (CLI) olarak kullanılabilir veya Go projeleri için bir kütüphane olarak içe aktarılabilir. Go Migrate, farklı kaynaklardan göç dosyalarını okuyabilir ve bunları doğru sırayla veritabanına uygulayabilir. Çeşitli veritabanı sürücülerini ve göç kaynaklarını destekler.

2. Sürümler

Go Migrate, şunları da içerecek şekilde çeşitli sürümleri destekler:

  • Master: Yeni özellikler ve hata düzeltmelerini içeren en son sürüm
  • v4: Üretim ortamları için uygun olan kararlı sürüm
  • v3: Artık desteklenmeyen ve kullanılmaması gereken sürüm

3. Kurulum

Go Migrate'ı kullanmak için Go paketini kurmanız gerekmektedir. Kurulum için aşağıdaki komutu çalıştırın:

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

3. Go Migrate Kullanımı

Go Migrate, CLI üzerinden veya Go projesinde bir kütüphane olarak kullanılabilir.

3.0. Veritabanı Bağlantı URL'leri

CLI veya Go kodu kullanılırken, veritabanına bağlanmak için veritabanı URL'leri yapılandırılmalıdır.

URL formatı:

dbdriver://kullanıcıadı:parola@sunucu:port/dbadı?param1=true&param2=false

Bu URL, veritabanına bağlanmak ve bağlantı parametrelerini belirtmek için kullanılan bir veritabanı bağlantı URL'sidir. Her bölüm için aşağıdaki açıklamaları içermektedir:

  1. dbdriver://: Bu, hangi veritabanı sürücüsünü kullanacağını belirtmek için kullanılan veritabanı sürücüsü için protokol kimliğidir, örn. mysql.
  2. kullanıcıadı:parola: Bu, kimlik doğrulaması için kullanılan kullanıcı adı ve paroladır. Genellikle, kullanıcı adı ve parola iki nokta ile ayrılır.
  3. @: Bu sembol, kullanıcı adı ve parolayı sunucu adı ve porttan ayırmak için kullanılır.
  4. sunucu:port: Bu, veritabanı sunucusunun ana bilgisayarı ve port numarasıdır. Sunucu adı, veritabanı sunucusunun IP adresi veya etki alanı adıdır ve port numarası, veritabanı sunucusunun dinlediği port numarasıdır.
  5. /dbadı: Bu, bağlanılacak veritabanının adıdır.
  6. ?param1=true&param2=false: Bu kısım, ek bağlantı parametrelerini belirtmek için kullanılan sorgu parametreleridir. Bu örnekte, iki parametre bulunmaktadır.

Bu sorgu parametreleri, belirli gereksinimlere göre ayarlanabilir ve bağlantının belirli özelliklerini veya davranışlarını yapılandırmak için veritabanı sürücüsünün ve veritabanı sunucusunun gereksinimlerine göre belirlenebilir.

Postgres Bağlantı Parametreleri

postgres://postgres:parola@localhost:5432/ornek?sslmode=disable

SQLite Bağlantı Parametreleri

sqlite3://yol/veritabanı?parametre

MongoDB Bağlantı Parametreleri

mongodb://kullanıcı:parola@sunucu:port/dbadı?parametre

3.1 CLI Kullanımı

3.1.1 Temel Kullanım

CLI'ı kullanmak için aşağıdaki komutu çalıştırın:

migrate -source file://yol/ile/göçler -database postgres://localhost:5432/veritabanı up 2

Bu komut, belirtilen kaynaktan belirtilen veritabanına göçleri uygular. "2" sayısı, uygulanacak göç sayısını belirtir.

3.1.2 Docker Kullanımı

Go Migrate, Docker ile de kullanılabilir. Aşağıdaki komutu çalıştırın:

docker run -v {{göç dizini}}:/göçler --network host migrate/migrate -path=/göçler/ -database postgres://localhost:5432/veritabanı up 2

Bu komut, Go Migrate'ı bir Docker konteynerinde çalıştırır ve belirtilen kaynaktan belirtilen veritabanına göçleri uygular.

3.2 Go Projenizde Kullanımı

Go Migrate'ı Go projesinde kullanmak için gerekli paketleri ve kütüphaneleri içe aktarmanız gerekmektedir. İşte bir örnek:

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)
}

Bu kod, belirtilen kaynak ve veritabanıyla Go Migrate'ı başlatır ve ardından Steps yöntemini kullanarak 2 göçü uygular.

Mevcut bir veritabanı istemcisini kullanmak istiyorsanız, lütfen aşağıdaki örneğe bakınız:

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()
}

Bu kod, gerekli paketleri içe aktarır ve sql paketi ile veritabanı istemcisini başlatır. Daha sonra, NewWithDatabaseInstance yöntemini kullanarak belirtilen kaynak ve veritabanı sürücüsünü belirterek yeni bir Go Migrate örneği oluşturur. Son olarak, Up yöntemini kullanarak göçü uygular.

4. Desteklenen Veritabanı Sürücüleri

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 ve MS SQL Server dahil olmak üzere birden fazla veritabanı sürücüsünü desteklemektedir.

5. Desteklenen Göç Kaynakları

Go Migrate, Dosya Sistemi, io/fs, Go-Bindata, pkger, GitHub, GitHub Enterprise, Bitbucket, Gitlab, AWS S3 ve Google Cloud Storage gibi birden fazla göç kaynağını desteklemektedir.

6. Göç Dosyaları

Go Migrate'daki göç dosyaları belirli dosya adı ve içerik formatlarına sahiptir.

6.1 Göç Dosyası Adı Formatı

Her göç, bir "yukarı" göç dosyası ve karşılık gelen bir "aşağı" göç dosyasından oluşur. Göç dosyası adları aşağıdaki formata uygun olmalıdır:

{versiyon}_{başlık}.up.{uzantı}
{versiyon}_{başlık}.down.{uzantı}

versiyon, göçlerin uygulanma sırasını temsil eden benzersiz bir numaradır. başlık, göçün isteğe bağlı bir açıklamasıdır. uzantı, kullanılan veritabanı sistemine bağlı olarak değişir (örneğin, SQL türevleri için .sql kullanılır).

6.2 Göç İçerik Formatı

Göç dosyalarının içeriği, genellikle SQL doğrudan yazılarak veritabanı sistemine bağlı olarak değişir.

Örneğin, aşağıdaki, iki göç dosyasıdır:

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

Göç dosyası 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
);

Göç dosyası 000001_create_users_table.down.sql, aşağı dosyası genellikle önceki işlemleri geri almaya yönelik olarak kullanılır.

DROP TABLE IF EXISTS users;

6.3 Göçün Geri Alınabilirliği

Geri alınabilir göçlerin yazılması en iyi uygulama olarak kabul edilir. Bu, yukarı ve aşağı göçlerin herhangi bir sürümde çalıştırılabilmesi ve etkili bir şekilde veritabanı durumunu yeniden oluşturup temizlemesi anlamına gelir.

Geri alınabilirliği sağlamak için her göçün karşılık gelen bir "up" ve "down" göç dosyası olmalıdır. "Up" göç dosyası, göçün uygulanması için işlemleri içerirken, "down" göç dosyası göçün geri alınması için işlemleri içerir.

7. MySQL Kullanımı

Go Migrate, MySQL veritabanları için destek sağlar. Bir MySQL veritabanına bağlanmak için, veritabanı URL'sinin aşağıdaki formatta olması gerekir:

mysql://kullanıcı:şifre@tcp(sunucu:port)/veritabanı_adı?sorgu

URL, göç tablo adı, TLS parametreleri vb. gibi sorgu parametrelerini içerebilir. Sorgu parametrelerinin tam listesi için lütfen Go Migrate MySQL belgelerine başvurun.

7.1 URL Sorgu Parametreleri

  • x-migrations-table: Göç tablosunun adı.
  • x-no-lock: GET_LOCK/RELEASE_LOCK ifadelerini atlamak için true olarak ayarlayın. Çoklu ana MySQL sürümleri için kullanışlıdır.
  • x-statement-timeout: Belirtilen milisaniye sayısını aşan herhangi bir ifadeyi iptal eder.
  • dbname: Bağlanılacak veritabanının adı.
  • user: Giriş yapılacak kullanıcı.
  • password: Kullanıcının şifresi.
  • host: Bağlanılacak sunucu.
  • port: Bağlanılacak port.
  • tls: TLS/SSL şifreleme bağlantı parametreleri.
  • x-tls-ca: CA (Sertifika Yetkilisi) dosyasının konumu.
  • x-tls-cert: İstemci sertifikası dosyasının konumu.
  • x-tls-key: Özel anahtar dosyasının konumu.
  • x-tls-insecure-skip-verify: SSL kullanılıp kullanılmayacağı.

7.2 Varolan İstemcilerle Kullanım

Eğer Go Migrate'i varolan bir MySQL istemcisiyle kullanmayı düşünüyorsanız, istemci oluştururken multiStatements=true parametresini kullanmayı unutmayın. İşte bir örnek:

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", "kullanıcı:şifre@tcp(sunucu:port)/veritabanı_adı?multiStatements=true")
    driver, _ := mysql.WithInstance(db, &mysql.Config{})
    m, _ := migrate.NewWithDatabaseInstance(
        "file:///göçler",
        "mysql", 
        driver,
    )
    
    m.Steps(2)
}

Bu kod gerekli paketleri içe aktarır, bir MySQL veritabanı istemcisi oluşturur ve Go Migrate'i veritabanı örneği ile başlatır. Ardından Steps yöntemini kullanarak iki göç uygular.