Pemrograman

14 Menghapus (Delete) Data Gorm Library

Panduan lengkap menghapus data di GORM dengan Golang, termasuk delete record, delete by primary key, delete hooks, dan unit test. Cocok untuk pemula!

GORM adalah library ORM (Object-Relational Mapping) yang populer digunakan dalam pengembangan aplikasi Golang. Salah satu fitur penting dari GORM adalah kemampuannya untuk menghapus data dari database dengan berbagai metode.

Dalam artikel ini, kita akan membahas langkah-langkah menghapus data menggunakan GORM, termasuk cara menghapus berdasarkan primary key, penggunaan delete hooks, dan bagaimana menulis unit test untuk memastikan kode berjalan dengan baik.

1. Menghapus Sebuah Record

Contoh Kode

package main

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

type User struct {
    ID   uint
    Name string
}

func deleteUser(db *gorm.DB, user User) error {
    result := db.Delete(&user)
    if result.Error != nil {
        return result.Error
    }
    fmt.Println("User deleted successfully")
    return nil
}

Penjelasan Kode

  • db.Delete(&user) menghapus record user dari database.

Unit Test

package main

import (
    "testing"
    "github.com/DATA-DOG/go-sqlmock"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

func TestDeleteUser(t *testing.T) {
    db, mock, _ := sqlmock.New()
    gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
    
    mock.ExpectExec("DELETE FROM users WHERE id = \$1").WithArgs(1).WillReturnResult(sqlmock.NewResult(0, 1))
    
    user := User{ID: 1, Name: "Alice"}
    err := deleteUser(gormDB, user)
    if err != nil {
        t.Errorf("Error deleting user: %v", err)
    }
}

Penjelasan Kode Unit Test

  • Menggunakan sqlmock untuk membuat mock database.
  • Menyimulasikan query DELETE pada tabel users.
  • Memastikan tidak ada error saat penghapusan.

2. Menghapus Data Berdasarkan Primary Key

Contoh Kode

func deleteUserByID(db *gorm.DB, userID uint) error {
    result := db.Delete(&User{}, userID)
    if result.Error != nil {
        return result.Error
    }
    fmt.Println("User deleted by ID successfully")
    return nil
}

Penjelasan Kode

  • db.Delete(&User{}, userID) menghapus record berdasarkan userID tanpa perlu mengambil datanya terlebih dahulu.

Unit Test

func TestDeleteUserByID(t *testing.T) {
    db, mock, _ := sqlmock.New()
    gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
    
    mock.ExpectExec("DELETE FROM users WHERE id = \$1").WithArgs(1).WillReturnResult(sqlmock.NewResult(0, 1))
    
    err := deleteUserByID(gormDB, 1)
    if err != nil {
        t.Errorf("Error deleting user by ID: %v", err)
    }
}

Penjelasan Kode Unit Test

  • Menggunakan sqlmock untuk menyimulasikan eksekusi query DELETE berdasarkan ID.
  • Memastikan tidak ada error saat penghapusan.

3. Menggunakan Delete Hooks

Contoh Kode

type Product struct {
    ID    uint
    Name  string
}

func (p *Product) BeforeDelete(tx *gorm.DB) (err error) {
    fmt.Println("Before deleting product", p.Name)
    return nil
}

func deleteProduct(db *gorm.DB, product Product) error {
    result := db.Delete(&product)
    if result.Error != nil {
        return result.Error
    }
    fmt.Println("Product deleted successfully")
    return nil
}

Penjelasan Kode

  • BeforeDelete(tx *gorm.DB) dieksekusi sebelum produk dihapus.
  • db.Delete(&product) akan menjalankan hook sebelum menghapus data.

Unit Test

func TestDeleteProduct(t *testing.T) {
    db, mock, _ := sqlmock.New()
    gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
    
    mock.ExpectExec("DELETE FROM products WHERE id = \$1").WithArgs(1).WillReturnResult(sqlmock.NewResult(0, 1))
    
    product := Product{ID: 1, Name: "Laptop"}
    err := deleteProduct(gormDB, product)
    if err != nil {
        t.Errorf("Error deleting product: %v", err)
    }
}

Penjelasan Kode Unit Test

  • Menggunakan sqlmock untuk memvalidasi penghapusan produk.
  • Memastikan bahwa query DELETE dijalankan dengan benar.

Kesimpulan

  • Delete() digunakan untuk menghapus record dalam database.
  • Kita bisa menghapus data langsung dengan primary key tanpa mengambil record terlebih dahulu.
  • GORM menyediakan BeforeDelete hook untuk melakukan operasi sebelum penghapusan.
  • Unit testing menggunakan sqlmock membantu memastikan fungsionalitas bekerja sesuai harapan tanpa membutuhkan database nyata.

Untuk mempelajari lebih lanjut tentang Golang, silakan baca:

comments powered by Disqus

Topik Terhangat

pemrograman
152
jaringan
28
tips-dan-trik
27
tutorial
20
hardware
11
linux
4
kubernetes
1
trik-and-tips
1