Links

MySQL

MYSQL, bir ilişkisel veritabanı yönetim sistemidir. MySQL yönetimi için kullanacağımız kütüphanenin adı Go-MySQL-Driver. Kütüphanemizi aşağıdaki gibi komut satırına yazarak indirelim.
go get -u github.com/go-sql-driver/mysql
MySQL paketlerimizi import edelim.
import "database/sql"
import _ "go-sql-driver/mysql"
MySQL Bağlantısını Yapma Daha sonra main() fonksiyonumuz içerisinde MySQL bağlantımızı yapalım.
package main
import "database/sql"
import _ "go-sql-driver/mysql"
func main(){
db, err := sql.Open("mysql", "kullanici:[email protected](127.0.0.1:3306)/vtismi?parseTime=true")
err := db.Ping()
}
db adındaki fonksiyonel değişkenimize MySQL veritabanı bağlantı bilgilerimizi girdik. kullanici yeri MySQL kullanıcı adınızı, sifre yerine MySQL şifrenizi, 127.0.0.1:3306 yerine MySQL sunucunuzu e vtismi yerine de Veritabanı isminizi yazmayı unutmayın. Daha sonra veritabanı bağlantı bilgilerimizi doğrulanmak için db.Ping() fonksiyonu ile bağlantı denemesi yolluyoruz. Bir hata ile karşılaşıldığında err değişkeninin içine hata çıktısını kaydedecektir. Kolaylık olsun diye main() fonksiyonu dışına hata çıktılarını kontrol eden bir fonksiyon yazalım.
func kontrol(hata error){
if hata != nil{
log.Fatal(hata)
}
}
Eğer hata çıktısı almak istemiyorsanız. err değişkeni yerine _ (alt tire) koyabilirsiniz. Aynen şu şekilde:
db, _ := sql.Open("mysql", "kullanici:[email protected](127.0.0.1:3306)/vtismi?parseTime=true")
İlk Tabloyu Oluşturma Tablomuz şu şekilde olacak;
id
kullanici
sifre
tarih
1
kaan
1234
2019-08-10 12:30:00
Böyle bir tablo yapısını oluşturmak için aşağıdaki sorguyu çalıştırmamız gerekir.
CREATE TABLE kullanicilar (
id INT AUTO_INCREMENT,
kullanici TEXT NOT NULL,
sifre TEXT NOT NULL,
tarih DATETIME,
PRIMARY KEY (id)
);
Bu sorguyu Golang tarafında yapmak istersek aşağıdaki gibi yazabiliriz.
sorgu := `
CREATE TABLE kullanicilar (
id INT AUTO_INCREMENT,
kullanici TEXT NOT NULL,
şifre TEXT NOT NULL,
tarih DATETIME,
PRIMARY KEY (id)
);`
//Sorguyu çalıştırma
_, err := db.Exec(sorgu)
Bu işlemle birlikte MySQL veritabanımızda kullanicilar adında bir tablomuz oluşacaktır. Tabloya Veri Girme
kullaniciDegeri := "johndoe"
sifreDegeri := "secret"
tarihDegeri := time.Now()
sonuc, err := db.Exec(`INSERT INTO kullanicilar (kullanici, sifre, tarih) VALUES (?, ?, ?)`, kullaniciDegeri, sifreDegeri, tarihDegeri)
kullaniciID, err := sonuc.LastInsertId()
fmt.Println("Eklenen kullanıcının id'si:", kullaniciID)
Tabloya Sorgu Yapma
//Tabloyu sorgulayıp sonuçları değişkenlere yazdıralım
sorgu:= `SELECT id, kullanici, sifre, tarih FROM kullanicilar WHERE id = ?`
err := db.QueryRow(sorgu, sorguid).Scan(&id, &kullanici, &sifre, &tarih)
//Çıkan aldığımız verileri ekrana bastıralım
fmt.Println(id, kulanici, sifre, tarih)
Tablodaki Tüm Verileri Sıralama
var (
id int
kullanici string
sifre string
tarih time.Time
)
tablo, _ := db.Query(`SELECT id, kullanici, sifre, tarih FROM kullanicilar`)
defer tablo.Close() //tabloyu kapamayı unutmuyoruz
for tablo.Next() {
err := tablo.Scan(&id, &kullanici, &sifre, &tarih)
kontrol(err)
fmt.Println(id, kullanici, sifre, tarih) //kullaniciyi ekrana bastır
}
err := tablo.Err()
kontrol(err)
Eğer tablodaki verileri ekrana bastırmak yerine bir diziye (array) kaydetmek istiyorsak aşağıdaki gibi yapabiliriz.
type kullanici struct {
id int
kullanici string
sifre string
tarih time.Time
}
tablo, _ := db.Query(`SELECT id, kullanici, sifre, tarih FROM kullanicilar`)
defer rows.Close()
var kullanicilar []kullanici
for tablo.Next() {
var k kullanici
err := tablo.Scan(&k.id, &k.kullanici, &k.sifre, &k.tarih)
kontrol(err)
kullanicilar = append(kullanicilar, k)
}
err := tablo.Err()
kontrol(err)
Bu işlemin sonucunda kullanicilar dizimiz şu şekilde olacaktır.
kullanicilar {
kullanici {
id: 1,
kullanici: "ahmet",
sifre: "1234",
tarih: time.Time{wall: 0x0, ext: 63701044325, loc: (*time.Location)(nil)},
},
kullanici {
id: 2,
kullanici: "mehmet",
sifre: "5678",
tarih: time.Time{wall: 0x0, ext: 63701044622, loc: (*time.Location)(nil)},
},
}
Tablodan Satır Silme
silineceksatir := 1
_, err := vt.Exec(`DELETE FROM kullanicilar WHERE id = ?`, silineceksatir)
kontrol(err)
Gördüğünüz gibi basit bir şekilde MySQL paketi ile veritabanı yönetimi yapabiliyoruz. Hepsi Bir Arada
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
func kontrol(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
vt, err := sql.Open("mysql", "kullanici:[email protected](127.0.0.1:3306)/vtismi?parseTime=true")
if err := db.Ping(); err != nil {
kontrol(err)
}
{ // Yeni tablo oluştur
sorgu := `
CREATE TABLE kullanicilar (
id INT AUTO_INCREMENT,
kullanici TEXT NOT NULL,
sifre TEXT NOT NULL,
tarih DATETIME,
PRIMARY KEY (id)
);`
_, err := db.Exec(sorgu)
kontrol(err)
}
{ // Yeni kayıt ekle
kullanici := "kaan"
sifre := "1234"
tarih := time.Now()
sonuc, err := db.Exec(`INSERT INTO kullanicilar (kullanici, sifre, tarih) VALUES (?, ?, ?)`, username, password, createdAt)
kontrol(err)
eklenenid, err := sonuc.LastInsertId()
fmt.Println(eklenenid)
}
{ // İstenilen kaydı sorgulama
var (
id int
kullanici string
sifre string
tarih time.Time
sorguid int = 1
)
sorgu := "SELECT id, kullanici, sifre, tarih FROM kullanici WHERE id = ?"
err := vt.QueryRow(sorgu, sorguid).Scan(&id, &kullanici, &sifre, &tarih)
kontrol(err)
fmt.Println(id, kullanici, sifre, tarih)
}
{ // Tün kayıtları sorgula
type kullanici struct {
id int
kullanici string
sifre string
tarih time.Time
}
tablo, err := vt.Query(`SELECT id, kullanici, sifre, tarih FROM kullanicilar`)
kontrol(err)
defer tablo.Close()
var kullanicilar []kullanici
for tablo.Next() {
var k kullanici
err := tablo.Scan(&k.id, &k.kullanici, &k.sifre, &k.tarih)
kontrol(err)
kullanici = append(kullanicilar, k)
}
err := rows.Err()
kontrol(err)
fmt.Printf("%#v", kullanicilar)
}
//Kayıt Sil
{
silinecekid := 1
_, err := vt.Exec(`DELETE FROM kullanicilar WHERE id = ?`, silinecekid)
kontrol(err)
}
}