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
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
IsDeleteddengan tipebooluntuk menandai data sebagai dihapus. - Fungsi
deleteUserFlagmemperbarui nilaiis_deletedmenjaditruetanpa menghapus data dari database.
Unit Test
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
deleteUserFlagdapat mengupdate kolomis_deletedtanpa error.
2. Unix Second
Contoh Kode
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
deleteUserUnixmengupdatedeleted_atdengan waktu saat ini.
Unit Test
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_unixesdengan SQLMock. - Memastikan fungsi
deleteUserUnixberjalan tanpa error.
3. Use 1 / 0 as Delete Flag
Contoh Kode
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
1sebagai penanda bahwa data dihapus. - Fungsi
deleteUserIntFlagmemperbarui kolomdeletedmenjadi1.
Unit Test
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
deleteUserIntFlagbekerja sesuai harapan.
4. Mixed Mode
Contoh Kode
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 flagIsDeleted. - Fungsi
deleteUserMixedmengupdate kedua kolom tersebut sekaligus.
Unit Test
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
deleteUserMixedbekerja sesuai harapan.
Kesimpulan
- Delete flag menggunakan nilai
true/falseuntuk menandai penghapusan data. - Unix second menyimpan waktu penghapusan dalam bentuk timestamp.
- Menggunakan angka
1/0sebagai flag penghapusan juga umum dalam praktik database. - Mixed mode menggabungkan metode soft delete bawaan GORM dengan delete flag.
IHFollow
Ihsan Arif
Backend engineer & penulis di Santekno. Aktif menulis tentang Go, Laravel, dan arsitektur backend modern.