Mastering Golang
  • Tentang Go
  • Instalasi Go
  • Membuat Project Go
  • Go Run & Go Build
  • Apa itu Package pada Go
  • Imports dan Exports
  • Variabel
  • Tipe Data
  • Konstanta dan Komentar
  • Operator
  • Type Conversion
  • Kondisional - IF
  • Kondisional - Switch Case
  • Looping
  • Array
  • Array - Looping
  • Slices
  • Pointer
  • Map
  • Fungsi
  • Struct
  • Method
  • Interface
  • Interface Kosong
  • Concurrency
  • Concurrency - Goroutines
  • Channel
  • Buffered Channel
  • Channel - Close and Range
  • Channel - Direction
  • Channel - Select
  • Concurrency - WaitGroup
  • Concurrency - Mutex
  • JSON Data
  • SQL
  • URL Parsing
  • GO Vendor
  • Unit Testing
  • Go Basic for Web Development
    • Aplikasi Web pada Go - Hello World
    • Root Routing
    • Query String
    • Web Service API Server
    • HTTP Basic Auth
    • RESTFul API dengan Gin dan Gorm
Powered by GitBook
On this page
  • Instalasi Driver
  • Setup Database
  • Membaca data dari MySQL Server
  • Membaca 1 Record Data Menggunakan Method QueryRow()
  • INSERT, UPDATE, dan DELETE

Was this helpful?

SQL

PreviousJSON DataNextURL Parsing

Last updated 4 years ago

Was this helpful?

Go menyediakan database/sql untuk dapat menggunakan SQL pada Go. Kita perlu untuk menginstal driver database baik itu MySQL , sqlite , postgres , dan lainnya pada local komputer kita dan juga pada aplikasi Go.

Untuk driver database kita memerlukan external. Kamu dapat menginstal sesuai dengan driver yang ingin digunakan. Pada sesi ini kita akan menggunakan driver database MySQL.

Instalasi Driver

Kita akan menggunakan database driver MySQL. Silahkan melakukan instalasi pada aplikasi Go yang sudah dibuat:

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

Setup Database

Untuk menjalankan database SQL dengan driver , pastikan kamu telah menginstal MySQL pada local komputer. Setelah itu kita bisa mengakses MySQL melalui command line ataupu GUI seperti dan .

Pada contoh ini kita akan menggunakan command line untuk memanipulasi data query SQL.

Untuk mengakses MySQL , ketik perintah berikut ini:

mysql -u root -p

Selanjutnya masukkan query berikut ini untuk membuat sebuah database bernama goschool :

CREATE DATABASE goschool;

Kita juga harus memilih database yang ingin digunakan:

USE goschool;

Selanjutnya kita akan membuat table dan column serta memasukkan beberapa data:

CREATE TABLE IF NOT EXISTS students (
  id int(5) NOT NULL AUTO_INCREMENT,
  fullname varchar(255) NOT NULL,
  age int(11) NOT NULL,
  batch varchar(100) NOT NULL,
  PRIMARY KEY (id)
);

INSERT INTO students (id, fullname, age, batch) VALUES
(1, 'Wisma Eka', 24, 'adorable'),
(2, 'Yudis', 22, 'brilliant'),
(3, 'Sukisno', 35, 'creative'),
(4, 'Guntur', 30, 'dilligent');

Membaca data dari MySQL Server

Kita sudah memiliki data pada database MySQL yaitu table students yang berisi 4 baris data. Selanjutnya kita akan membaca dan menampilkan data dari MySQL Server.

Kita perlu mengimport package database/sql dan juga _ "github.com/go-sql-driver/mysql" . Kita lihat ada tanda _ yang berarti package tersebut kita butuhkan namin tidak kita gunakan secara langsung pada kode kita.

Selanjutnya kita akan membuat struct yang menggambarkan struktur data kita pada table database:

type Student struct {
	ID       int
	Fullname string
	Age      int
	Batch    string
}

Kita butuh untuk memastikan terlebih dahulu aplikasi Go kita telah terhubung dengan MySQL server. Untuk itu kita akan membuat fungsi connect() dan menggunakan fungsi sql.Open untuk meregistrasi data MySQL server yang kita gunakan:

sql.Open("mysql", "user:password@/dbname")
func connect() (*sql.DB, error) {
	db, err := sql.Open("mysql", "root:root@/goschool")
	if err != nil {
		panic(err)
	}

	return db, nil
}

Selanjutnya kita akan mencoba menampilkan data pada table students di dalam fungsi sqlQuery :

func sqlQuery() {
	// Check connection
	db, err := connect()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer db.Close()
	
	// Get data based on id student
	var id = 1
	rows, err := db.Query("select fullname, age, batch from students where id= ?", id)

	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer rows.Close()
	
	// Menampung data dari database ke dalam struct
	var result []Student
	for rows.Next() {
		var each = Student{}
		if err := rows.Scan(&each.Fullname, &each.Age, &each.Batch); err != nil {
			log.Fatal(err)
		}
		result = append(result, each)
	}
	
	// Menampilkan data
	for _, value := range result {
		fmt.Println(value.Fullname)
		fmt.Println(value.Age)
		fmt.Println(value.Batch)
	}
}

Kode lengkapnya akan menjadi seperti di bawah ini:

package main

import (
	"database/sql"
	"fmt"
	"log"

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

type Student struct {
	ID       int
	Fullname string
	Age      int
	Batch    string
}

func connect() (*sql.DB, error) {
	db, err := sql.Open("mysql", "root:root@/goschool")
	if err != nil {
		panic(err)
	}

	return db, nil
}

func sqlQuery() {
	db, err := connect()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer db.Close()

	var id = 1
	rows, err := db.Query("select fullname, age, batch from students where id= ?", id)

	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer rows.Close()

	var result []Student
	for rows.Next() {
		var each = Student{}
		if err := rows.Scan(&each.Fullname, &each.Age, &each.Batch); err != nil {
			log.Fatal(err)
		}
		result = append(result, each)
	}

	for _, value := range result {
		fmt.Println(value.Fullname)
		fmt.Println(value.Age)
		fmt.Println(value.Batch)
	}
}

func main() {
	sqlQuery()
}

Jika program di atas kita jalanka maka akan terlihat output program seperti berikut ini:

Membaca 1 Record Data Menggunakan Method QueryRow()

Jika kita membutuhkan 1 record data, kita bisa menggunakan method QueryRow yang lebih singkat secara kode seperti berikut ini:

package main

import (
	"database/sql"
	"fmt"

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

type Student struct {
	ID       int
	Fullname string
	Age      int
	Batch    string
}

func connect() (*sql.DB, error) {
	db, err := sql.Open("mysql", "root:root@/goschool")
	if err != nil {
		panic(err)
	}

	return db, nil
}

func sqlQuery() {
	db, err := connect()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer db.Close()

	var id = 1
	var student = Student{}
	err = db.QueryRow("select fullname, age, batch from students where id= ?", id).
		Scan(&student.Fullname, &student.Age, &student.Batch)

	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println(student.Fullname)
	fmt.Println(student.Age)
	fmt.Println(student.Batch)
}

func main() {
	sqlQuery()
}

INSERT, UPDATE, dan DELETE

Untuk melakukan proses INSERT , UPDATE , dan DELETE kita bisa menggunakan fungsi exec karena fungsi ini jika dijalankan tidak akan mengembalikan data row pada database.

package main

import (
	"database/sql"
	"fmt"

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

type Student struct {
	ID       int
	Fullname string
	Age      int
	Batch    string
}

func connect() (*sql.DB, error) {
	db, err := sql.Open("mysql", "root:root@/goschool")
	if err != nil {
		panic(err)
	}

	return db, nil
}

func sqlQuery() {
	db, err := connect()
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	defer db.Close()

	_, err = db.Exec("insert into students values (?, ?, ?, ?)", 5, "David Winalda", 26, "Clever")
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println("insert data success!")

	_, err = db.Exec("update students set age = ? where id = ?", 27, 4)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println("update data success!")

	_, err = db.Exec("delete from students where id = ?", 2)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println("delete data success!")
}

func main() {
	sqlQuery()
}

Jika program di atas dijalankan maka akan menampilkan output berikut ini:

package
package
package
MySQL
Dbeaver
Sequel Pro
Data yang diambil dari database
Data yang diambil dari database
Menjalankan query menggunakan fungsi Exec