Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer

Go Programlama Dili (Golang) ile Veritabanı İşlemleri

2 min read

golang mysql

Go Programlama Dili (Golang) ile aklınıza gelebilecek hemen her projeyi hayata geçirebilirsiniz. Projelerin türüne göre kullanılan teknolojiler değişmektedir ancak veritabanlarının birçok projede yaygın olarak kullanıldığını söyleyebiliriz. İşte bu nedenle Golang ile veritabanı (mysql) kullanımını basit örnekler ve kodlarla anlatmak istedim. Eğer Go dili ile kodlamaya başlamak için gerekli çalışma ortamını hazırladıysanız haydi başlayalım.

Github Sayfası ve Örnek Kodlar

Bu yazıda anlatılan tüm kodlar ve veritabanı şemasına projenin Github sayfasından ulaşabilirsiniz.

MySQL Driver Kurulumu ve Pakete Eklenmesi

Go Programlama Dili‘nde kullanacağınız veritabanına göre ilgili driver’ı kurmanız gerekmektedir. Bu yazımızda anlatacağım MySQL kullanımı için gerekli MySQL driver‘ını aşağıdaki komut ile kullanabiliriz.

go get -u github.com/go-sql-driver/mysql

Yükleme işlemi tamamlandıktan sonra projemizde veritabanı kullanımı için şu iki kütüphaneyi aşağıdaki şekilde projeye dahil etmeliyiz.

package ...

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
)

...

Örnek Veritabanı ve Tablonun Oluşturulması

Bu mini projemizde örnek bir veritabanı ve tablo kullanacağız. Bunun için öncelikle bir çalışma ortamınızda bir veritabanı oluşturmalısınız. Ben “godb” isimli bir veritabanı oluşturdum. Tablo olarak da aşağıdaki SQL sorgusunu, kullanacağınız veritabanında çalıştırabilirsiniz.

DROP TABLE IF EXISTS `posts`;

CREATE TABLE `posts` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(30) NOT NULL,
  `body` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `posts` (`id`, `title`, `body`)
VALUES
	(1,'Hello World','The content of the hello world'),
	(2,'Hello Second World','The content of the hello second world');

Veritabanı (MySQL) Bağlantısının Yapılması

Gerekli paketlerin dâhil edilmesi ve örnek veritabanı ile tablonun kurulmasının ardından yapmamız gereken ilk şey veritabanına bağlantı kurmak. Bunun için golang dosyamızda aşağıdaki methodu kullanabiliriz. Elbette buradaki veritabanı ismi, kullanıcı adı ve parola gibi hususları kendi çalışma ortamınıza göre değiştirmelisiniz.

...
func dbConn() (db *sql.DB) {

	dbDriver := "mysql"
	dbUser := "root"
	dbPass := "root"
	dbName := "godb"
	db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
	if err != nil {
		panic(err.Error())
	}

	return db

}
...

Tabloya Uygun Struct Yapısının Oluşturulması

Go Programlama Dili yani Golang‘de veritabanından veriyi çekerken, bu veriye uygun bir struct oluşturmalısınız. Bizim projemizdeki Posts tablosuna uygun struct yapısı şu şekildedir.

...
type Post struct {
	Id    int
	Title  string
	Body string
}
...

Bu aşamaya kadar yaptıklarımızı hazırlık olarak değerlendirebiliriz. Bundan sonra veritabanı ile istediğimiz gibi çalışabiliriz.

Tüm Kayıtların Çekilerek Listelenmesi

func getAll() {

	db := dbConn()

	selDB, err := db.Query("SELECT * FROM Posts ORDER BY id DESC")
	if err != nil {
		panic(err.Error())
	}

	post := Post{}
	posts := []Post{}

	for selDB.Next() {

		var id int
		var title, body string

		err = selDB.Scan(&id, &title, &body)
		if err != nil {
			panic(err.Error())
		}

		post.Id 	= id
		post.Title 	= title
		post.Body 	= body

		posts = append(posts, post)
	}

	for _, post := range posts {
		fmt.Println(post.Title)
	}
	
	defer db.Close()
}

Tek Kaydın Çekilerek Gösterilmesi

func getOne(postId int) {

	db 		:= dbConn()

	selDB, err := db.Query("SELECT * FROM Posts WHERE id=?", postId)
	if err != nil {
		panic(err.Error())
	}

	post := Post{}

	for selDB.Next() {

		var id int
		var title, body string

		err = selDB.Scan(&id, &title, &body)
		if err != nil {
			panic(err.Error())
		}

		post.Id 	= id
		post.Title 	= title
		post.Body 	= body

	}

	fmt.Println("Post Title	: " + post.Title)
	fmt.Println("Post Body	: " + post.Body)

	defer db.Close()
}

Yeni Kayıt Eklenmesi

func add() {

	db := dbConn()

	title 	:= "Hello Second World"
	body 	:= "The content of the hello second world"
	insertQuery, err := db.Prepare("INSERT INTO Posts(title, body) VALUES(?,?)")
	if err != nil {
		panic(err.Error())
	}

	insertQuery.Exec(title, body)

	fmt.Println("ADDED: Title: " + title + " | Body: " + body)

	defer db.Close()

}

Mevcut Kaydın Güncellenmesi

func update(postId int) {

	db := dbConn()

	title 	:= "Hello 1 World"
	body 	:= "The content of the hello 1 world"
	updateQuery, err := db.Prepare("UPDATE Posts SET title=?, body=? WHERE id=?")
	if err != nil {
		panic(err.Error())
	}

	updateQuery.Exec(title, body, postId)

	fmt.Println("UPDATED: Title: " + title + " | Body: " + body)

	defer db.Close()

}

Herhangi Bir Kaydın Silinmesi

func delete(postId int) {

	db := dbConn()

	deleteQuery, err := db.Prepare("DELETE FROM Posts WHERE id=?")
	if err != nil {
		panic(err.Error())
	}

	deleteQuery.Exec(postId)

	fmt.Println("DELETED")

	defer db.Close()

}

Main Methodu

Dosyamızda yukarıdaki methodları çalıştırmak için şöyle bir main methodu kullanabiliriz.

func main()  {

	add()
	update(1)
	delete(1)
	getOne(1)
	getAll()
	
}

Son Sözler

Bu projede temel seviyede programlama bilgisine sahip olanlara hitap edecek şekilde Golang ile veritabanı işlemlerini anlatmaya çalıştım. Tekrar etmem gerekirse yukarıda anlattığım kodların derli toplu ve çalışır haline projenin Github sayfasından ulaşabilirsiniz. İyi çalışmalar dilerim.

Erhan Yakut Software Developer @Binalyze | Founder @Passwall | Golang Enthusiast | Open Sorcerer