Pemrograman

15 Menghapus Data Secara Massal di GORM dengan Golang

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

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:

comments powered by Disqus

Topik Terhangat

pemrograman
153
jaringan
28
tips-dan-trik
27
tutorial
20
hardware
11
linux
4
kubernetes
1
trik-and-tips
1