Skip to content
Santekno.com | Tech Tutorials and Trends
ID
📖 0%
Go

14 Menghapus (Delete) Data Gorm Library

· 3 mnt baca ·Ihsan Arif

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

go
 1package main
 2
 3import (
 4    "fmt"
 5    "gorm.io/driver/sqlite"
 6    "gorm.io/gorm"
 7)
 8
 9type User struct {
10    ID   uint
11    Name string
12}
13
14func deleteUser(db *gorm.DB, user User) error {
15    result := db.Delete(&user)
16    if result.Error != nil {
17        return result.Error
18    }
19    fmt.Println("User deleted successfully")
20    return nil
21}

Penjelasan Kode

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

Unit Test

go
 1package main
 2
 3import (
 4    "testing"
 5    "github.com/DATA-DOG/go-sqlmock"
 6    "gorm.io/driver/postgres"
 7    "gorm.io/gorm"
 8)
 9
10func TestDeleteUser(t *testing.T) {
11    db, mock, _ := sqlmock.New()
12    gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
13    
14    mock.ExpectExec("DELETE FROM users WHERE id = \$1").WithArgs(1).WillReturnResult(sqlmock.NewResult(0, 1))
15    
16    user := User{ID: 1, Name: "Alice"}
17    err := deleteUser(gormDB, user)
18    if err != nil {
19        t.Errorf("Error deleting user: %v", err)
20    }
21}

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

go
1func deleteUserByID(db *gorm.DB, userID uint) error {
2    result := db.Delete(&User{}, userID)
3    if result.Error != nil {
4        return result.Error
5    }
6    fmt.Println("User deleted by ID successfully")
7    return nil
8}

Penjelasan Kode

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

Unit Test

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

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

go
 1type Product struct {
 2    ID    uint
 3    Name  string
 4}
 5
 6func (p *Product) BeforeDelete(tx *gorm.DB) (err error) {
 7    fmt.Println("Before deleting product", p.Name)
 8    return nil
 9}
10
11func deleteProduct(db *gorm.DB, product Product) error {
12    result := db.Delete(&product)
13    if result.Error != nil {
14        return result.Error
15    }
16    fmt.Println("Product deleted successfully")
17    return nil
18}

Penjelasan Kode

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

Unit Test

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

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:

IH
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.
Follow

💬 Komentar