Membuka Koneksi ke Postgres Database dengan Golang
Tags: go, postgres, indonesia, tutorial
Published: 2023-06-15 09:21:13


## Cek file-file v1
Repository/source code: https://github.com/JaisySymuri/postgre

Buat project baru (ex: postgre), kemudian di terminal ketik "go mod init <nama module>" yang dilanjutkan dengan <nama module> yang anda inginkan. Biasanya nama folder project tersebut atau alamat git. 

```js
go mod init postgre
```

Untuk belajar sendiri cukup pakai nama folder saja, namun jika anda berniat membagikan project anda, lebih baik menggunakan alamat git.  
```js
 go mod init github.com/JaisySymuri/postgre
```

Di tutorial ini karena saya tidak akan memanggil fungsi dari folder lain, maka tidak akan ada bedanya antara nama folder atau alamat git. Tapi jika anda memanggil fungsi dari <folder_lain>, maka akan ada perbedaan di bagian import. 

```js
import (
	"postgre/folder_lain"	
)
```
vs
```js
import (
	"github.com/JaisySymuri/postgre/folder_lain"	
)
```

IDE VScode ataupun GoLand cukup pintar untuk mendeteksi package apa yang anda butuhkan dan otomatis import sendiri. Namun jika ada salah import atau IDE tidak bisa mendeteksi package yang dibutuhkan, anda perlu menambahnya secara manual. 


Oke, selanjutnya buat file main.go dengan package main. Kemudian masukkan kode berikut:


```js
package main

// const berisi variable database yang ingin kita hubungi
const (
	host     = "localhost"
	port     = 9393
	user     = "postgres"
	password = "Sandhiguna"
	dbname   = "tutorial"
)

// dbConn berfungsi untuk menghubungi database
func dbConn() (db *sql.DB) {
	psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)

	db, err := sql.Open("postgres", psqlconn)
	if err != nil {
		log.Fatal("Could not connect to the database:", err)
	}

	return db
}

```
Di VScode, jika anda tekan Ctrl+S, IDE akan otomatis import package yang dibutuhkan. Di GoLand, anda tidak perlu lakukan apa-apa dan dia import otomatis. 

Untuk database package sudah terimport secara otomatis, yaitu "database/sql". Namun itu tidak cukup, juga perlu import drivernya

```js
go get github.com/lib/pq
```

kemudian di import kita tambahkan sendiri nama drivernya. Karena fungsi driver sendiri tidak digunakan, kita hanya perlu inisiasinya saja, maka kita perlu memambah tanda "_" di sebelum driver. Seperti ini:

```js
import (
	"database/sql"
	"fmt"
	"log"
	_ "github.com/lib/pq"
)
```

"psqlconn" adalah variable yang menggabungkan constanta yang kita tulis sebelumnya. Kemudiang kita menggunakan fungsi "Open" milik package "sql" untuk membuka koneksi. Kemudian atur penanganan error dan return 

## Unit Test
Untuk mengecek apakah koneksi benar-benar terhubung, kita akan menggunakan unit test. Buat folder baru dengan nama "test" dan buat file "connection_test.go" dengan package test. Perlu diingat, file unit test wajib berakhiran "_test.go". Copy Paste code sebelumnya dan edit sedikit seperti berikut:

```js
const (
	host     = "localhost"
	port     = 9393
	user     = "postgres"
	password = "Sandhiguna"
	dbname   = "tutorial"
)

func TestDbConn(t *testing.T) {
	psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)

	db, err := sql.Open("postgres", psqlconn)
	if err != nil {
		log.Fatal("Could not connect to the database:", err)
	}

	db.Close()
}

```js

Ubah nama fungsi dan ganti return di bagian bawah sebagai db.Close. Tambahkan driver secara manual di import seperti sebelumnya. Di VS code, clik tombol play berwarna hijau disamping fungsi test, jika berhasil akan keluar output seperti ini:

```js
=== RUN   TestDbConn
--- PASS: TestDbConn (0.00s)
PASS
ok      github.com/JaisySymuri/postgre/test     1.010s

```

Terakhir, untuk mempermudah transfer knowledge dan rollback, maka main.go akan saya copy, rename menjadi main-v1.go, select all kecuali package kemudian ctrl+/ untuk merubahnya menjadi komentar. Jadi jika anda baru mempelajari tahap ini, anda tidak akan bingung saat anda mengecek repository yang sudah lengkap hingga tahap akhir. Cukup cek file-file v1. Proses rollback juga akan jadi lebih mudah

Repository/source code: https://github.com/JaisySymuri/postgre