Pemrograman

12 Update Data Gorm Library Lanjutan (Bagian 1)

Pelajari lebih dalam cara melakukan update data di GORM dengan Batch Update, Block Global Updates, dan Updated Records Count dalam Golang. Dilengkapi dengan contoh kode dan unit test.

GORM merupakan ORM yang sangat fleksibel dalam menangani operasi update data. Setelah membahas dasar-dasar update data pada artikel sebelumnya, dalam artikel ini kita akan mendalami fitur-fitur lanjutan, seperti Batch Update, Block Global Updates, dan Updated Records Count.

5. Batch Update

Batch Update memungkinkan kita memperbarui banyak record dalam satu query untuk meningkatkan efisiensi.

Contoh Implementasi

// BatchUpdate memperbarui nama user berdasarkan ID yang diberikan
func BatchUpdate(db *gorm.DB, users []User) error {
    return db.Model(&User{}).Save(&users).Error // Memperbarui banyak record sekaligus
}

Penjelasan Kode

  • Fungsi BatchUpdate menerima parameter db (koneksi database) dan users (daftar pengguna yang akan diperbarui).
  • db.Model(&User{}) menentukan bahwa operasi dilakukan pada model User.
  • Save(&users) menyimpan semua perubahan dalam array users ke database.

Unit Test

func TestBatchUpdate(t *testing.T) {
    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    db.AutoMigrate(&User{})

    users := []User{
        {Name: "Alice", Email: "alice@example.com"},
        {Name: "Bob", Email: "bob@example.com"},
    }
    db.Create(&users)

    users[0].Name = "Alice Updated"
    users[1].Name = "Bob Updated"

    err := BatchUpdate(db, users)
    if err != nil {
        t.Errorf("Batch update gagal: %v", err)
    }
}

Penjelasan Kode Unit Test

  • Membuka koneksi database menggunakan SQLite.
  • Melakukan migrasi untuk memastikan tabel User tersedia.
  • Menambahkan beberapa pengguna ke dalam database.
  • Memperbarui nama pengguna dan memanggil fungsi BatchUpdate.
  • Jika terjadi error, test akan gagal.

6. Block Global Updates

GORM secara default memblokir update tanpa kondisi WHERE untuk menghindari kesalahan fatal.

Contoh Implementasi

// GlobalUpdateError mencoba memperbarui semua record tanpa kondisi WHERE
func GlobalUpdateError(db *gorm.DB) error {
    return db.Model(&User{}).Update("name", "Updated Name").Error // Ini akan gagal karena GORM memblokir global update
}

Penjelasan Kode

  • Fungsi GlobalUpdateError mencoba memperbarui kolom name tanpa kondisi WHERE.
  • GORM akan menolak update ini untuk mencegah perubahan pada seluruh tabel.

Unit Test

func TestGlobalUpdateError(t *testing.T) {
    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    db.AutoMigrate(&User{})

    err := GlobalUpdateError(db)
    if err == nil {
        t.Errorf("Global update tidak seharusnya diizinkan")
    }
}

Penjelasan Kode Unit Test

  • Membuka koneksi database SQLite dan melakukan migrasi tabel User.
  • Memanggil fungsi GlobalUpdateError.
  • Jika update berhasil, test akan gagal karena GORM seharusnya memblokir update tanpa kondisi.

7. Updated Records Count

GORM menyediakan fitur untuk mengetahui jumlah record yang diperbarui setelah melakukan operasi update.

Contoh Implementasi

// UpdateWithCount mengembalikan jumlah record yang diperbarui
func UpdateWithCount(db *gorm.DB, id uint, name string) (int64, error) {
    result := db.Model(&User{}).Where("id = ?", id).Update("name", name)
    return result.RowsAffected, result.Error
}

Penjelasan Kode

  • Fungsi UpdateWithCount menerima id dan name untuk diperbarui.
  • Where("id = ?", id) memastikan hanya record dengan ID tertentu yang diperbarui.
  • Update("name", name) mengubah kolom name.
  • result.RowsAffected mengembalikan jumlah record yang diperbarui.

Unit Test

func TestUpdateWithCount(t *testing.T) {
    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
    db.AutoMigrate(&User{})

    user := User{Name: "Charlie", Email: "charlie@example.com"}
    db.Create(&user)

    count, err := UpdateWithCount(db, user.ID, "Charlie Updated")
    if err != nil {
        t.Errorf("Gagal memperbarui user: %v", err)
    }
    if count != 1 {
        t.Errorf("Jumlah record yang diperbarui tidak sesuai, expected: 1, got: %d", count)
    }
}

Penjelasan Kode Unit Test

  • Membuka koneksi database SQLite dan memastikan tabel User tersedia.
  • Menambahkan satu user ke database.
  • Memanggil UpdateWithCount untuk memperbarui nama user.
  • Memeriksa apakah jumlah record yang diperbarui sesuai dengan ekspektasi (seharusnya 1).

Kesimpulan

Artikel ini telah membahas fitur lanjutan dari update data menggunakan GORM di Golang, termasuk Batch Update, Block Global Updates, dan Updated Records Count. Dengan pemahaman yang baik, Anda dapat lebih optimal dalam menangani operasi update data di aplikasi Anda.


Baca Juga:

comments powered by Disqus

Topik Terhangat

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