Instalasi Docker dan Postgres
Webapp testing post akan kita gunakan form login yang telah dibuat pada modul sebelumnya. Untuk data, kita akan gunakan Postgres Database yang diintall dalam docker. Jika Anda ingin mengikuti environment yang digunakan pada tutorial, berikut hal yang perlu disiapkan.
- Install Docker, download di https://www.docker.com/
- Download file docker compose dan SQL di https://drive.google.com/file/d/1o-LVHElPE-MYTLHOcsEfitnQHGCg6t9E/view?usp=sharing (kemudian ekstrak di root direktori aplikasi).
- Buat direktori postgres-data pada root app direktori.
- Jika belum memiliki database manager, pada tutorial digunakan Beekeper Studio (free trial 20 hari).
Setelah docker terinstall, dan simpan file docker compose serta SQL di root direktori. Buka command prompt, pada app root direktori, jalankan perintah docker-compose.
$ docker-compose up
Perhatian, untuk compose pertama kali, disarankan menggunakan perintah docker diatas, untuk melihat proses download postgres. Untuk selanjutnya dapat digunakan option background
$ docker-compose up -d
Setelah docker live, selanjutnya kita bisa lakukan test database connection menggunakan database manager (lihat setting pada image dibawah).


Instalasi pgx
Selanjutnya, kita perlu install package untuk Postgres agar bisa diakses melalui Go. Pada tutorial digunakan GitHub – jackc/pgx: PostgreSQL driver and toolkit for Go
Untuk instalasi, masuk ke root app melalui command prompt, lalu jalankan perintah berikut:
$ go get https://github.com/jackc/pgx/v4
Perhatian, gunakan versi 4, untuk mencegah error.
Database Connection Testing
Langkah selanjutnya adalah melakukan testing database connection, buat file cmd/web/db.go, gunakan code berikut:
package main
import (
"database/sql"
"log"
_ "github.com/jackc/pgconn"
_ "github.com/jackc/pgx/v4"
_ "github.com/jackc/pgx/v4/stdlib"
)
func openDB(dsn string) (*sql.DB, error) {
db, err := sql.Open("pgx", dsn)
if err != nil {
return nil, err
}
err = db.Ping()
if err != nil {
return nil, err
}
return db, nil
}
func (app *application) connectToDB() (*sql.DB, error) {
connection, err := openDB(app.DSN)
if err != nil {
return nil, err
}
log.Println("Connected to Postgres!")
return connection, nil
}
Kemudian modifikasi file cmd/web/main.go untuk melakukan koneksi ke database.
package main
import (
"database/sql"
"flag"
"log"
"net/http"
"github.com/alexedwards/scs/v2"
)
type application struct {
DSN string
DB *sql.DB
Session *scs.SessionManager
}
func main() {
//setup app config
app := application{}
//database connection string
flag.StringVar(&app.DSN, "dsn", "host=localhost port=5432 user=postgres password=postgres dbname=users sslmode=disable timezone=UTC connect_timeout=5", "Postgres Connection")
flag.Parse()
//connection to database
conn, err := app.connectToDB()
if err != nil {
log.Fatal(err)
}
defer conn.Close()
app.DB = conn
//get session manager
app.Session = getSession()
//start server
log.Println("Starting server on port 8080...")
err = http.ListenAndServe(":8080", app.routes())
if err != nil {
log.Fatal(err)
}
}
JIka kita jalankan aplikasi, sesuai ekspektasi koneksi ke database berhasil.
$ go run ./cmd/web
2022/10/24 18:15:17 Connected to Postgres!
2022/10/24 18:15:17 Starting server on port 8080...
Sampai disini kita sudah berhasil terhubung ke database, pada modul selanjutnya kita akan menambahkan package database model.