My Profile Photo

Mehmet Cem Yücel


Technical Writings.
Architecture, Security, Java, Golang, Devops, Microservices, Spring Boot, Kafka, Distributed Systems and Blockchain


Golang DB Migration RDBMS ORM Integration

“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.

  1. Golang ile Uçtan Uca Proje Yapımı Serisi
  2. Golang Configuration Management
  3. Golang Central Logging Management
  4. Golang DB Migration - RDBMS & ORM Integration
  5. Golang API Management
  6. 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.




May interest this topics

If you interested in Blockchain Technologies,


comments powered by Disqus