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
1package main
2
3import (
4 "gorm.io/gorm"
5)
6
7type User struct {
8 ID uint
9 Name string
10}
11
12func deleteUsersBatch(db *gorm.DB, userIDs []uint) error {
13 result := db.Delete(&User{}, userIDs)
14 return result.Error
15}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
1func TestDeleteUsersBatch(t *testing.T) {
2 db, mock, _ := sqlmock.New()
3 defer db.Close()
4 gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
5
6 mock.ExpectExec("DELETE FROM users").WillReturnResult(sqlmock.NewResult(0, 2))
7
8 err := deleteUsersBatch(gormDB, []uint{1, 2})
9 if err != nil {
10 t.Errorf("Error deleting batch users: %v", err)
11 }
12}Penjelasan Kode Unit Test
- Menggunakan SQLMock untuk menguji query
DELETE FROM users. - Memastikan penghapusan batch berhasil tanpa error.
2. Block Global Delete
Contoh Kode
1func blockGlobalDelete(db *gorm.DB) {
2 db.Session(&gorm.Session{AllowGlobalUpdate: false})
3}Penjelasan Kode
db.Session(&gorm.Session{AllowGlobalUpdate: false})mencegah penghapusan semua data tanpa kondisiWHERE.
Unit Test
1func TestBlockGlobalDelete(t *testing.T) {
2 db, mock, _ := sqlmock.New()
3 defer db.Close()
4 gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
5
6 mock.ExpectExec("DELETE FROM users").WillReturnError(fmt.Errorf("global delete not allowed"))
7
8 blockGlobalDelete(gormDB)
9 result := gormDB.Delete(&User{})
10 if result.Error == nil {
11 t.Errorf("Global delete should be blocked, but it wasn't")
12 }
13}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
1type Product struct {
2 ID uint
3 Name string
4}
5
6func deleteProductWithReturn(db *gorm.DB, productID uint) (*Product, error) {
7 var product Product
8 result := db.Where("id = ?", productID).Delete(&product)
9 if result.Error != nil {
10 return nil, result.Error
11 }
12 return &product, nil
13}Penjelasan Kode
db.Where("id = ?", productID).Delete(&product)menghapus data dan mengembalikan objek produk yang dihapus.
Unit Test
1func TestDeleteProductWithReturn(t *testing.T) {
2 db, mock, _ := sqlmock.New()
3 defer db.Close()
4 gormDB, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
5
6 mock.ExpectExec("DELETE FROM products WHERE id = ?").WillReturnResult(sqlmock.NewResult(1, 1))
7
8 deletedProduct, err := deleteProductWithReturn(gormDB, 1)
9 if err != nil || deletedProduct == nil {
10 t.Errorf("Failed to return deleted product data")
11 }
12}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:
# Golang
# GORM
# Batch Delete GORM
# Block Global Delete GORM
# Returning Deleted Data GORM
# ORM Golang
# Belajar Golang
# Tutorial Golang
# Golang Database
IHFollow
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.