“Golang ile Uçtan Uca Proje Yapımı Serisi” 4. yazısında Go’da db migrationı nasıl yapılır sorusunun cevabını arayacağız. Ayrıca RDBMS(Postgre) entegrasyonunu bir ORM toolu(Gorm) kullanarak nasıl yapabileceğimize değineceğiz.
DB Migration
Bir uygulamanız olduğunu hayal edin, çalışmadan önce yaratılmış olmasına ihtiyaç duyduğu tablolar, bu tabloların içerisinde dolu olması beklenen kayıtlar, grantler, indexler vb barındırıyor. Everything as a code yaklaşımı genellikle CI/CD processlerinin kodlanması anlamını taşısa da uçtan uca her şeyin kodlanarak halledilmesini de ifade eder, buna veritabanı de dahil. Çünkü Twelve Factor’de bahsedilen Dev/Prod Parity kavramını karşılayabilmek başka türlü pek de mümkün değildir.
Bu tarz ihtiyaçları karşılayabilmek için db migration toolları piyasada bulunmaktadır. Java için Liquibase, Flyway gibi toollar olduğu gibi Golang dünyasında da benzer toollar bulunuyor. DB migration’ı için Migrate toolunu kullanacağız.
Migrate toolunu yapılandırmak için bağlanacağımız dbnin bilgilerini ve hangi dbye bağlanacaksak o dbnin connector’ını eklememiz gerekiyor. Migrate edilecek dosyaları ./db
klasörünün altına koyulacak şekilde yapılandırmasını yaptım.
Burada dosya isimlendirme formatının bir anlamı bulunuyor.
aaaa_bbbb.[up]/[down].sql
- aaaa: sequential artan bir numara ile changeset id, sıralı tutabilmek için bir best practice
- bbbb: changeset’i açıklayı bir bilgi
- up: changeset i barındıran dosya
- down: up dosyası herhangi bir noktasında fail olursa rollback için gereken scriptlerin bulunduğu dosya
Bir changesetin hem up hem de down dosyasının yazılması zorunludur. İlk defa migrate.Up()
metodunun çalıştırılması ile birlikte dbde schema_migrations
isimli bir tablo yaratılarak en son çalıştırılan changesetin bilgisi tutulmaya başlanır. Böylelikle yeni gelen changesetler ayırt edilerek sadece en son yapılan migrationdan itibaren yeni eklenen changesetlerin çalıştırılması mümkün olur.
RDBMS & ORM Integration
Db entegrasyonu da benzer yapılandırma parametreleri ile sağlanıyor. Farklı olarak ben projeye bir ORM toolu da ekleyerek projenin mappinginin daha kolay yönetilmesini tercih ettim. Gorm Golang için güçlü bir ORM toolu, DB schemasının yaratımı, object mapping, kendi query dili gibi özellikler barındırıyor. Aşağıda bir entity ve tablosunun örneğini ve bu entity yi oluşturmak için gereken repository için bir örneği bulabilirsiniz.
Serinin sonraki yazısı API Yönetimi hakkında, buradan erişebilirsiniz.
Serinin tüm yazılarına aşağıdaki linkler aracılığıyla erişebilirsiniz.
- Golang ile Uçtan Uca Proje Yapımı Serisi
- Golang Configuration Management
- Golang Central Logging Management
- Golang DB Migration - RDBMS & ORM Integration
- Golang API Management
- Golang Message Broker - Object Mapping - Testing
Yukarıda değindiğimiz bütün kodlara https://github.com/mehmetcemyucel/blog/tree/master/demo adresinden erişebilirsiniz.