Database
Database yang digunakan dalam materi ini adalah database mysql versi 8. Query-query yang digunakan akan memaksimalkan query native pada paket database/sql bawaan golang. Pertimbangannya, paket database/sql sudah cukup mudah untuk digunakan, dan performancenya sangat baik.
Pembahasan database dibagi dalam 3 bahasan, yaitu: pembuatan migration, seed dan implementasi ListUsers dimana datanya diambil dari database.
Langkah pertama adalah membuat database. Buka mysql dan buatlah schema : "essentials"
Kemudian buat koneksi database dengan membuat fungsi openDb(). Misalkan user=root dan password=pass.
func openDB() (*sql.DB, error) {
return sql.Open("mysql", "root:pass@tcp(localhost:3306)/essentials?parseTime=true")
}Migration
Ada banyak library yang mengerjakan proses migration. Kali ini saya akan menggunakan library darwin karena cukup simple.
Buat folder schema. Kemudian buatlan file schema/migrate.go yang isinya sebagai berikut :
// file schema/migrate.go
package schema
import (
"database/sql"
"github.com/GuiaBolso/darwin"
)
var migrations = []darwin.Migration{
{
Version: 1,
Description: "Add users",
Script: `
CREATE TABLE users (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
username CHAR(15) NOT NULL UNIQUE,
password varchar(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
is_active TINYINT(1) NOT NULL DEFAULT '0',
created TIMESTAMP NOT NULL DEFAULT NOW(),
updated TIMESTAMP NOT NULL DEFAULT NOW(),
PRIMARY KEY (id)
);`,
},
}
// Migrate attempts to bring the schema for db up to date with the migrations
// defined in this package.
func Migrate(db *sql.DB) error {
driver := darwin.NewGenericDriver(db, darwin.MySQLDialect{})
d := darwin.New(driver, migrations, nil)
return d.Migrate()
}Di file main.go akan dilakukan perubahan agar mampu mendukung dua perintah, yaitu perintah listenAndServe http serta perintah migrate yang jalan di console. Perintah flag.Parse() digunakan untuk menangkap parsing parameter yang dilempar dari console.
Kemudian bandingkan argumen yang diterima, jika argumen == migrate maka eksekusi schema/Migrate() dan setelah selesai diberi perintah return agar baris kode selanjutnya tidak dieksekusi.
Selain argumen == migrate, akan diabaikan sehingga baris kode yang dijalankan adalah baris http listenAndServe.
Karena shema/Migrate() membutuhkan koneksi database, maka di awal fungsi utama akan dilakukan pemanggilan fungsi koneksi database.
Jangan lupa untuk mengimport paket essentials/schema dan _ "github.com/go-sql-driver/mysql"
Jalankan
go run main.go migratedango run main.go
Seed
Digunakan untuk dump data users
Buatlah file schema/seed.go
Fungsi seed menggunakan fitur transaction, sehingga jika ada query yang gagal akan dirollback semua.
Di file main.go ditambahkan kode untuk menghandle jika ada perintah cli dengan parameter seed.
Saat ini sudah ada dua perintah cli, yaitu migrate dan seed. Karena dimungkinkan akan ada banyak perintah cli yang lain, maka perintah if akan diganti dengan swicth case saja.
Jalankan perintah
go run main.go seed
ListUsers
Saat ini isi/data dari ListUsers masih di-hardcode. Kini kita akan mengisinya dengan data dari tabel users.
Ganti handle ListUsers dengan method Users.List
Buat type Users dengan Db yang diinject dari fungsi utama (dependency injection).
Buat method Users.List
Di fungsi utama, ubah parameter Handler pada server untuk memanggil Users.List
Berikut hasil akhir dari file main.go
Last updated
Was this helpful?