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 berdasarkanuserID
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:
Previous post
13 Advanced Update Data Gorm Library
Artikel Terhangat
14 Menghapus (Delete) Data Gorm Library
03 Mar 2025
13 Advanced Update Data Gorm Library
03 Mar 2025
11 Update Data GORM Library
03 Mar 2025
08 Advanced Query dengan GORM di Golang
03 Mar 2025

14 Menghapus (Delete) Data Gorm Library
03 Mar 2025

13 Advanced Update Data Gorm Library
03 Mar 2025

11 Update Data GORM Library
03 Mar 2025

08 Advanced Query dengan GORM di Golang
03 Mar 2025