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

12 Update Data Gorm Library Lanjutan (Bagian 1)

· 3 mnt baca ·Ihsan Arif

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

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

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

go
 1func TestBatchUpdate(t *testing.T) {
 2    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
 3    db.AutoMigrate(&User{})
 4
 5    users := []User{
 6        {Name: "Alice", Email: "alice@example.com"},
 7        {Name: "Bob", Email: "bob@example.com"},
 8    }
 9    db.Create(&users)
10
11    users[0].Name = "Alice Updated"
12    users[1].Name = "Bob Updated"
13
14    err := BatchUpdate(db, users)
15    if err != nil {
16        t.Errorf("Batch update gagal: %v", err)
17    }
18}

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

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

Penjelasan Kode

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

Unit Test

go
1func TestGlobalUpdateError(t *testing.T) {
2    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
3    db.AutoMigrate(&User{})
4
5    err := GlobalUpdateError(db)
6    if err == nil {
7        t.Errorf("Global update tidak seharusnya diizinkan")
8    }
9}

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

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

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

go
 1func TestUpdateWithCount(t *testing.T) {
 2    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
 3    db.AutoMigrate(&User{})
 4
 5    user := User{Name: "Charlie", Email: "charlie@example.com"}
 6    db.Create(&user)
 7
 8    count, err := UpdateWithCount(db, user.ID, "Charlie Updated")
 9    if err != nil {
10        t.Errorf("Gagal memperbarui user: %v", err)
11    }
12    if count != 1 {
13        t.Errorf("Jumlah record yang diperbarui tidak sesuai, expected: 1, got: %d", count)
14    }
15}

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:

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

💬 Komentar