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:
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: