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 migrate dan go 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?