«

»

Şub 08 2016

Beego, Golang (Go) ve ORM

Önceki yazılarda Go ve Beego konusunda birşeyler yazmıştım, şuradan bakabilirsiniz:

Bu yazının konusu ise Beego framework kullanarak, ORM (Object Relational Mapping) uygulaması olacak.

ORM nedir?

Özetle; veritabanı ile uygulama kodları arasına giren bir katmandır. Uygulama ORM’yi tanır, onunla konuşur. ORM de veritabanını tanır onunla konuşur. Şöyle birşey:

ORM ve Beego

Faydası ise kodların veritabanından bağımsız olmasıdır. SQLite için yazdığınız kodu aynı zamanda MySQL veya PostgreSQL için de kullanabilmenizi sağlar. Veritabanındaki tablolar ve alanlar, kod tarafında struct veya sınıf ve değişkenler gibi yapılar ile eşleştirilir. Bu eşleştirme ORM’nin görevidir. ORM herhangi bir dile özel birşey değildir, güncel dillerin çoğu bir şekilde ORM destekler.

Örnek uygulama

Çok sade bir veritabanına Beego ORM kütüphanesi ile okuyup yazma çalışması yapacağız. Önce sqlite (sürüm 3) ile kodları yazalım, sonra 1 satır kod değişikliği yaparak farklı bir veritabanına geçebileceğimizi göreceğiz zaten. Veritabanını ve tabloları aşağıdaki gibi oluşturalım:

Yukarıdaki işlemleri yaptığımızda, ornek.db adında bir dosya oluşacak ve bu dosyada SQL kodları ile belirtilen yapı oluşturulacaktır. Eğer sqlite veritabanını komple ekrana dökmek istersek, dump işlemi yapabiliriz. Örnek:

Eğer tablomuzda kayıtlar olsaydı, dump komutu verildiğinde onlar da listelenecekti.

Beego ORM framework katmanı

Bu yazı yazıldığı sırada; sqlite, MySQL ve PostgreSQL veritabanları destekleniyordu. Kullanımı oldukça basit, Go dili yazım tarzı ile uyumlu. Go yazarken farklı birşeyler öğrenmek zorunda kalmayacaksınız. Framework’ün web sayfası şurada: https://github.com/astaxie/beego/tree/master/orm. Sayfada kullanılış şekli de verilmiş. Ben de aşağıda kendi dilimizde açıklamaya çalışayım:

Gerekli kütüphaneleri yükleyelim

Go’nun güzel özelliklerinden birisi, Github üzerinden doğrudan kütüphane kullanabilmesi. Aşağıda bu küçük uygulamamız için kullanılması gereken kütüphanelerin olduğu bölüm gösterilmiştir:

Satırların ne amaçla yazıldığı zaten anlaşılıyor. Uygulamadaki veritabanına göre sadece 1 tane veritabanı kütüphanesi (sqlite3, mysql, postgresql) kullanılması yeterli tabiiki. sqlite için çok sayıda kütüphane var, Beego’nun geliştiricisi yukarıda yazılanı tavsiye ediyor. Sebep olarak ta Go içerisinde gelen database/sql  paketi ile uyumlu olduğunu belirtiyor. Ben de fazla sorgulamadan aynen uyguladım.

Veritabanındaki alanlar ile eşleşecek olan değişkenler

Bunun için struct kullanıyoruz. Aşağıda örnek kodlar verilmiştir:

Anlaşılacağı üzere; User ifadesi tabloya karşılık geliyor. Id ve Name değişkenleri de tablodaki alanlara karşılık geliyor. Go’nun değişken türlerinde; metod içinde private olarak kullanılacak olanların küçük harfle, public olanların ise büyük harfle başlaması gerektiğini unutmayalım. Bu nedenle; id yerine Id yazıyoruz efendim. Değişken tanımlamalarının hemen yanında orm katmanına özel kısımlar geliyor. Id alanına veritabanı tarafından otomatik değer atanacağını ve Name kısmının da veritabanında 100 karakter ile depolanacağını belirtmiş oluyoruz.

Tanımlanan modelin veritabanına bağlanması

Aşağıdaki kodlarda bu işlemin başlangıç (init ~ initialization) fonksiyonunda nasıl yapılacağı gösterilmiştir:

RegisterModel komutu, User yapısı (struct) kullanılarak yeni bir orm modeli oluşturuyor. İkinci komutla da kullanacağımız veritabanını belirtmiş oluyoruz. Parametrelerin anlamı şu şekilde:

  • “default” kullanılacak olan varsayılan veritabanı budur.
  • “mysql” veritabanının türü. Alternatif seçenekler: sqlite3 ve postgresql
  • kullanıcı:parola@/veritabanı?charset=utf8” SQL bağlantı cümlesi.
  • 30: bağlantı zaman aşımı süresi

CRUD işlemleri

CRUD (Create, Read, Update, Delete) işlemleri için yine Astaxie’nin örneğinden faydalanıyoruz:

Kodlar zaten sade olduğundan detaya girmeyeceğim. “o” isminde yeni bir ORM oluşturuluyor. İsmi “Hüsamettin” olan User tipinde bir struct kayıt oluşturuluyor. o.Insert komutu ile bu kayıt tabloya ekleniyor. Eklenen kayıda veritabanı tarafından otomatik verilen Id değeri, id değişkenine aktarılıyor. İsim, “Şukubettin” olacak şekilde değiştiriliyor. Id alanı falanca olan kayıdı getir diyerekten, çaktırmadan  SELECT yapılıyor. Son olarak ta ilgili kayıt siliniyor. Veritabanını açıp baktığımızda birşey göremeyeceğiz yani :)

Çalıştırmak için hazır kod

Yukarıdaki kısımlar, üreticinin (Astaxie) kendi dokümanlarından aktarılmıştı. Şimdi de tam olarak çalışan bir kod verelim. Üst tarafta “örnek uygulama” başlığında verilen veritabanı yapısını (Id, Username, Departname, Created alanları olan) kullanacağız. Bu nedenle öncelikle sqlite3 veritabanının orada anlaıldığı gibi hazırlanması gerekiyor. Veritabanını oluşturduktan sonra, alttaki kodları hedehodo.go  şeklinde kaydederseniz, sonra da go build hedehodo.go  derseniz, kodu derlemiş olursunuz. Sonra her çalıştırdığınızda, veritabanında birşeyer yapacaktır.

Alt satırlardaki _ ile başlayan kodların saçma bir gerekçesi var, onu da yazayım. Normalde bu tarz işlere gerek kalmayacak muhtemelen. Go ile kod derlerken bir değişkeni tanımlayıp ta kullanmazsanız, kızıyor. Bu satırlar da onların hiç kullanılmamış olmasını engellemek için yazıldı. CRUD işlemlerinden bazılarını // şeklinde açıklama satırı yaptığımızda orada tanımlanan değişkenleri de “tanımlanmamış” hale getiriyoruz aslında. Alttaki _ ile başlayan kısımlarla bu tarz durumlarda oynamak gerekebiliyor. Özetle; alt çizgi sembolü, tanımlanmış bir değişken kullanılmaz ise Go’nun kızmaması için kullanılıyor.

Sonraki yazıda inşallah CRUD işlemlerinin yine ORM kullanaraktan, varsayılan Beego MVC projesinde ( bee new yeni_proje ) uygulanması şeklinde birşeyler olacak. Tabii önce ben öğrenmeliyim :)

Bad Behavior has blocked 19 access attempts in the last 7 days.