Pelajari cara menghapus data secara massal di GORM dengan Golang, melindungi data dari penghapusan global, dan mengembalikan data dari baris yang dihapus (Batch Delete, Block Global Delete, Returning Data).
Melanjutkan artikel sebelumnya tentang penghapusan data menggunakan GORM, kali ini kita akan membahas metode penghapusan data dalam jumlah besar, cara memblokir penghapusan global, serta bagaimana mengembalikan data dari baris yang dihapus.
1. Batch Delete
Contoh Kode
package main
import (
"gorm.io/gorm"
)
type User struct {
ID uint
Name string
}
func deleteUsersBatch(db *gorm.DB, userIDs []uint) error {
result := db.Delete(&User{}, userIDs)
return result.Error
}
Penjelasan Kode
- Menggunakan
db.Delete(&User{}, userIDs)
untuk menghapus banyak data berdasarkan daftar ID. - Tidak menghapus data secara permanen jika fitur soft delete diaktifkan.
Unit Test
func TestDeleteUsersBatch(t *testing.T) {
db, mock, _ := sqlmock.New()
defer db.Close()
gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
mock.ExpectExec("DELETE FROM users").WillReturnResult(sqlmock.NewResult(0, 2))
err := deleteUsersBatch(gormDB, []uint{1, 2})
if err != nil {
t.Errorf("Error deleting batch users: %v", err)
}
}
Penjelasan Kode Unit Test
- Menggunakan SQLMock untuk menguji query
DELETE FROM users
. - Memastikan penghapusan batch berhasil tanpa error.
2. Block Global Delete
Contoh Kode
func blockGlobalDelete(db *gorm.DB) {
db.Session(&gorm.Session{AllowGlobalUpdate: false})
}
Penjelasan Kode
db.Session(&gorm.Session{AllowGlobalUpdate: false})
mencegah penghapusan semua data tanpa kondisiWHERE
.
Unit Test
func TestBlockGlobalDelete(t *testing.T) {
db, mock, _ := sqlmock.New()
defer db.Close()
gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
mock.ExpectExec("DELETE FROM users").WillReturnError(fmt.Errorf("global delete not allowed"))
blockGlobalDelete(gormDB)
result := gormDB.Delete(&User{})
if result.Error == nil {
t.Errorf("Global delete should be blocked, but it wasn't")
}
}
Penjelasan Kode Unit Test
- Menggunakan SQLMock untuk menguji penghapusan tanpa kondisi
WHERE
. - Memastikan global delete diblokir dengan error yang sesuai.
3. Returning Data From Deleted Rows
Contoh Kode
type Product struct {
ID uint
Name string
}
func deleteProductWithReturn(db *gorm.DB, productID uint) (*Product, error) {
var product Product
result := db.Where("id = ?", productID).Delete(&product)
if result.Error != nil {
return nil, result.Error
}
return &product, nil
}
Penjelasan Kode
db.Where("id = ?", productID).Delete(&product)
menghapus data dan mengembalikan objek produk yang dihapus.
Unit Test
func TestDeleteProductWithReturn(t *testing.T) {
db, mock, _ := sqlmock.New()
defer db.Close()
gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
mock.ExpectExec("DELETE FROM products WHERE id = ?").WillReturnResult(sqlmock.NewResult(1, 1))
deletedProduct, err := deleteProductWithReturn(gormDB, 1)
if err != nil || deletedProduct == nil {
t.Errorf("Failed to return deleted product data")
}
}
Penjelasan Kode Unit Test
- Menggunakan SQLMock untuk memastikan query
DELETE FROM products WHERE id = ?
dieksekusi. - Memastikan fungsi mengembalikan data produk yang dihapus.
Kesimpulan
- Batch Delete memungkinkan penghapusan beberapa record sekaligus.
- Block Global Delete melindungi database dari penghapusan tanpa kondisi
WHERE
. - Returning Data From Deleted Rows memungkinkan pengambilan data sebelum dihapus.
Untuk mempelajari lebih lanjut tentang Golang, silakan baca:
Previous post
14 Menghapus (Delete) 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