KaryaBayar

Newsletter Books

Gorm Golang

BY Ariadi Ahmad Jan 15, 2025 Free

Install And Connect

install library gorm

go get -u gorm.io/gorm

Install Drive Sql

go get -u gorm.io/driver/sqlite

Create Connectin Golang

package main

import (
	"fmt"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

var db *gorm.DB
var err error

func initializeDatabase() (*gorm.DB, error) {
	// Membuat koneksi ke database SQLite
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		return nil, fmt.Errorf("failed to connect database: %v", err)
	}
	return db, nil
}

func main() {
	db, err = initializeDatabase()
	if err != nil {
		panic(err)
	}

    // Lanjutkan dengan operasi database menggunakan variabel `db`
}

Create Model

type User struct {
	ID       uint   `gorm:"primaryKey"`
	Username string `gorm:"uniqueIndex"`
	Email    string
	Password string
}

Migrasi

// Pastikan database sudah diinisialisasi
db, err := initializeDatabase()
if err != nil {
	panic(err)
}

// Melakukan migrasi untuk model User
db.AutoMigrate(&User{})

Referensi : https://gorm.io/docs/migration.html

Create

func createUser(username, email, password string) (*User, error) {
	user := &User{Username: username, Email: email, Password: password}
	result := db.Create(user)
	return user, result.Error
}

Get Data

func getUserByID(id uint) (*User, error) {
	var user User
	result := db.First(&user, id)
	return &user, result.Error
}

Update

func updateUserEmail(id uint, newEmail string) (*User, error) {
	user, err := getUserByID(id)
	if err != nil {
		return nil, err
	}
	user.Email = newEmail
	result := db.Save(user)
	return user, result.Error
}

Delete

func deleteUser(id uint) error {
	user, err := getUserByID(id)
	if err != nil {
		return err
	}
	result := db.Delete(user)
	return result.Error
}

Operasi Lanjutan


1. Query dengan Relasi:

Jika Anda memiliki model yang berhubungan, Anda dapat dengan mudah menarik relasi tersebut

type Profile struct {
	ID     uint
	Name   string
	UserID uint
	User   User
}

db.Preload("User").Find(&profiles)

// Membuat profile untuk user baru
newProfile := Profile{Name: "Alice Wonderland", UserID: newUser.ID}
db.Create(&newProfile)

// Menampilkan semua profil dengan informasi pengguna yang terkait
var profiles []Profile
db.Preload("User").Find(&profiles)

for _, profile := range profiles {
    fmt.Printf("Profile Name: %s, Username: %s, Email: %s\n", profile.Name, profile.User.Username, profile.User.Email)
}
  • Preload memastikan bahwa relasi User untuk setiap Profile juga dimuat.


2. Pemilihan Kolom Khusus:

Jika Anda hanya ingin memilih beberapa kolom tertentu:

var usernames []string
db.Model(&User{}).Pluck("username", &usernames)

3. Pengurutan dan Limitasi:

Mengurutkan hasil berdasarkan kolom tertentu dan membatasi jumlah hasil:

var users []User
db.Order("username desc").Limit(5).Find(&users)

4. Pengelompokan dan Agregasi:

Misalkan Anda ingin menghitung jumlah pengguna dengan email domain yang sama:

type Result struct {
	Domain string
	Count  int
}

var results []Result
db.Model(&User{}).Select("SUBSTR(email, INSTR(email, '@') + 1) AS domain, COUNT(*) as count").Group("domain").Scan(&results)

5. Menggunakan Raw SQL:

Jika Anda perlu menulis query SQL kustom:

var users []User
db.Raw("SELECT * FROM users WHERE username = ?", "ariadi").Scan(&users)

6. Pengkondisian Lebih Lanjut:

Untuk kasus-kasus yang lebih kompleks, Anda bisa menggunakan Where:

db.Where("username LIKE ? ", "ari%").Find(&users)

Kesimpulan:

Sponsored

GORM memberikan kekuatan penuh dalam mengakses dan memanipulasi database, mulai dari operasi sederhana hingga query lanjutan yang kompleks. Meskipun begitu, selalu pastikan untuk memahami efek dari query yang Anda jalankan, terutama dalam hal kinerja dan keamanan.

Another Post

Mendalami Database Sharding

Basis data adalah komponen penting dari setiap aplikasi, tetapi juga merupakan salah satu komponen yang paling sulit untuk di-skala secara horizontal. Ketika aplikasi menerima peningkatan lalu lintas dan volume data, basis data dapat menjadi hambatan kinerja, yang mempengaruhi pengalaman pengguna.

Jan 16, 2025

Clean Architecture : Konsep Yang Paling Banyak Dibahas dalam membangun aplikasi

Ini adalah salah satu konsep architecture yang paling banyak di bahas dalam sofware engineering dimana konsep ini memberikan kita kerangkan untuk membangun aplikasi yang scalable

Feb 05, 2025

Sponsored

Cara Mengatasi Docker Mac Pesan Error Malware

Kalian punya pesan error malware di docker kalian, ini adalah solusi jitu untuk mengatasi hal tersebut

Jan 17, 2025