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¶m2=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:
-
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. -
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. -
@
: Bu sembol, kullanıcı adı ve parolayı sunucu adı ve porttan ayırmak için kullanılır. -
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. -
/dbadı
: Bu, bağlanılacak veritabanının adıdır. -
?param1=true¶m2=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çintrue
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.