Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
Go

15 Menghapus Data Secara Massal di GORM dengan Golang

· 3 mnt baca ·Ihsan Arif

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

go
 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

go
 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

go
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 kondisi WHERE.

Unit Test

go
 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

go
 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

go
 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:

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

💬 Komentar