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

17 Delete Flag dalam GORM untuk Soft Delete yang Efisien

· 4 mnt baca ·Ihsan Arif

Pelajari cara menggunakan delete flag dalam GORM untuk mengelola soft delete dengan metode boolean, Unix timestamp, dan mixed mode. Dilengkapi contoh kode dan unit test

Delete flag adalah metode alternatif untuk melakukan soft delete dengan cara menyimpan status penghapusan dalam bentuk flag, seperti nilai 1 atau 0, atau menggunakan timestamp Unix.

1. Delete Flag

Contoh Kode

go
 1package main
 2
 3import (
 4    "gorm.io/gorm"
 5)
 6
 7type User struct {
 8    ID         uint `gorm:"primaryKey"`
 9    Name       string
10    IsDeleted  bool `gorm:"default:false"`
11}
12
13func deleteUserFlag(db *gorm.DB, userID uint) error {
14    result := db.Model(&User{}).Where("id = ?", userID).Update("is_deleted", true)
15    return result.Error
16}

Penjelasan Kode

  • Menambahkan kolom IsDeleted dengan tipe bool untuk menandai data sebagai dihapus.
  • Fungsi deleteUserFlag memperbarui nilai is_deleted menjadi true tanpa menghapus data dari database.

Unit Test

go
 1func TestDeleteUserFlag(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("UPDATE users").WillReturnResult(sqlmock.NewResult(1, 1))
 7
 8    err := deleteUserFlag(gormDB, 1)
 9    if err != nil {
10        t.Errorf("Error deleting user flag: %v", err)
11    }
12}

Penjelasan Kode Unit Test

  • Menggunakan SQLMock untuk menguji query UPDATE users.
  • Memastikan fungsi deleteUserFlag dapat mengupdate kolom is_deleted tanpa error.

2. Unix Second

Contoh Kode

go
 1import (
 2    "time"
 3)
 4
 5type UserUnix struct {
 6    ID         uint `gorm:"primaryKey"`
 7    Name       string
 8    DeletedAt  int64 `gorm:"default:0"`
 9}
10
11func deleteUserUnix(db *gorm.DB, userID uint) error {
12    result := db.Model(&UserUnix{}).Where("id = ?", userID).Update("deleted_at", time.Now().Unix())
13    return result.Error
14}

Penjelasan Kode

  • Menggunakan timestamp Unix untuk menandai data sebagai dihapus dengan DeletedAt.
  • Fungsi deleteUserUnix mengupdate deleted_at dengan waktu saat ini.

Unit Test

go
 1func TestDeleteUserUnix(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("UPDATE user_unixes").WillReturnResult(sqlmock.NewResult(1, 1))
 7
 8    err := deleteUserUnix(gormDB, 1)
 9    if err != nil {
10        t.Errorf("Error deleting user with unix timestamp: %v", err)
11    }
12}

Penjelasan Kode Unit Test

  • Menguji query UPDATE user_unixes dengan SQLMock.
  • Memastikan fungsi deleteUserUnix berjalan tanpa error.

3. Use 1 / 0 as Delete Flag

Contoh Kode

go
 1type UserFlag struct {
 2    ID         uint `gorm:"primaryKey"`
 3    Name       string
 4    Deleted    int `gorm:"default:0"`
 5}
 6
 7func deleteUserIntFlag(db *gorm.DB, userID uint) error {
 8    result := db.Model(&UserFlag{}).Where("id = ?", userID).Update("deleted", 1)
 9    return result.Error
10}

Penjelasan Kode

  • Menggunakan integer 1 sebagai penanda bahwa data dihapus.
  • Fungsi deleteUserIntFlag memperbarui kolom deleted menjadi 1.

Unit Test

go
 1func TestDeleteUserIntFlag(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("UPDATE user_flags").WillReturnResult(sqlmock.NewResult(1, 1))
 7
 8    err := deleteUserIntFlag(gormDB, 1)
 9    if err != nil {
10        t.Errorf("Error deleting user with integer flag: %v", err)
11    }
12}

Penjelasan Kode Unit Test

  • Menggunakan SQLMock untuk mengekspektasikan query UPDATE user_flags.
  • Memastikan fungsi deleteUserIntFlag bekerja sesuai harapan.

4. Mixed Mode

Contoh Kode

go
 1type UserMixed struct {
 2    ID         uint `gorm:"primaryKey"`
 3    Name       string
 4    DeletedAt  gorm.DeletedAt `gorm:"index"`
 5    IsDeleted  bool `gorm:"default:false"`
 6}
 7
 8func deleteUserMixed(db *gorm.DB, userID uint) error {
 9    result := db.Model(&UserMixed{}).Where("id = ?", userID).Updates(map[string]interface{}{
10        "deleted_at": gorm.DeletedAt{Time: time.Now()},
11        "is_deleted": true,
12    })
13    return result.Error
14}

Penjelasan Kode

  • Kombinasi antara soft delete bawaan GORM (DeletedAt) dan flag IsDeleted.
  • Fungsi deleteUserMixed mengupdate kedua kolom tersebut sekaligus.

Unit Test

go
 1func TestDeleteUserMixed(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("UPDATE user_mixeds").WillReturnResult(sqlmock.NewResult(1, 1))
 7
 8    err := deleteUserMixed(gormDB, 1)
 9    if err != nil {
10        t.Errorf("Error deleting user with mixed mode: %v", err)
11    }
12}

Penjelasan Kode Unit Test

  • Menggunakan SQLMock untuk mengekspektasikan query UPDATE user_mixeds.
  • Memastikan fungsi deleteUserMixed bekerja sesuai harapan.

Kesimpulan

  • Delete flag menggunakan nilai true/false untuk menandai penghapusan data.
  • Unix second menyimpan waktu penghapusan dalam bentuk timestamp.
  • Menggunakan angka 1/0 sebagai flag penghapusan juga umum dalam praktik database.
  • Mixed mode menggabungkan metode soft delete bawaan GORM dengan delete flag.
IH
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.
Follow

💬 Komentar