Pemrograman

11 Update Data GORM Library

Pelajari cara melakukan update data menggunakan GORM dalam Golang dengan langkah-langkah lengkap. Artikel ini mencakup Save All Fields, Update Single Column, Update Multiple Columns, Update Selected Fields, dan Update Hooks, serta unit test untuk setiap metode.

GORM adalah ORM (Object-Relational Mapping) yang populer dalam ekosistem Golang. Dengan GORM, kita dapat melakukan berbagai operasi database dengan lebih mudah, termasuk operasi update data. Dalam artikel ini, kita akan membahas beberapa cara melakukan update di GORM beserta unit test untuk memastikan implementasi berjalan dengan baik.

1. Menyimpan Semua Field dengan Save

Metode Save digunakan untuk menyimpan semua field dalam struct, termasuk yang tidak mengalami perubahan.

Contoh Implementasi

package main

import (
    "gorm.io/driver/sqlite"
    "gorm.io/gorm"
    "log"
    "testing"
)

// User merepresentasikan tabel users dalam database
type User struct {
    ID    uint   `gorm:"primaryKey"` // ID sebagai primary key
    Name  string // Nama user
    Email string // Email user
}

// SaveAllFields menyimpan semua field user ke database
func SaveAllFields(db *gorm.DB, user *User) error {
    return db.Save(user).Error // Menyimpan user ke database, baik data baru maupun yang diperbarui
}

Penjelasan Kode

  • Struct User merepresentasikan tabel dalam database dengan field ID, Name, dan Email.
  • Fungsi SaveAllFields menerima parameter db untuk koneksi database dan user sebagai data yang akan disimpan.
  • db.Save(user).Error digunakan untuk menyimpan data ke dalam database, jika data belum ada maka akan dibuat, jika sudah ada maka akan diperbarui.

Unit Test

func TestSaveAllFields(t *testing.T) {
    db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) // Membuka koneksi database SQLite
    db.AutoMigrate(&User{}) // Melakukan migrasi tabel User

    user := User{Name: "John Doe", Email: "john@example.com"}
    db.Create(&user) // Menyimpan user baru
    
    user.Name = "Updated Name" // Mengubah nama user
    err := SaveAllFields(db, &user) // Menyimpan perubahan ke database
    if err != nil {
        t.Errorf("Gagal menyimpan user: %v", err) // Menampilkan error jika penyimpanan gagal
    }
}

Penjelasan Kode

  • Koneksi database dibuat dengan gorm.Open menggunakan SQLite.
  • db.AutoMigrate(&User{}) memastikan tabel User sudah ada.
  • db.Create(&user) menyimpan data awal ke database.
  • user.Name = "Updated Name" mengubah nama user.
  • SaveAllFields(db, &user) menyimpan perubahan nama ke database.
  • Jika terjadi error, maka akan dicetak pesan error dalam unit test.

2. Mengupdate Satu Kolom dengan Update

Gunakan Update untuk memperbarui satu kolom tertentu.

Contoh Implementasi

// UpdateSingleColumn memperbarui satu kolom berdasarkan ID
func UpdateSingleColumn(db *gorm.DB, id uint, name string) error {
    return db.Model(&User{}).Where("id = ?", id).Update("name", name).Error // Update kolom name berdasarkan ID
}

Penjelasan Kode

  • Fungsi UpdateSingleColumn menerima id user dan name yang akan diperbarui.
  • db.Model(&User{}) mengacu pada model User.
  • Where("id = ?", id) mencari data berdasarkan id.
  • Update("name", name) hanya memperbarui kolom name.

Unit Test

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

    user := User{Name: "John Doe", Email: "john@example.com"}
    db.Create(&user) // Membuat user baru
    
    err := UpdateSingleColumn(db, user.ID, "New Name") // Memperbarui nama user
    if err != nil {
        t.Errorf("Gagal memperbarui satu kolom: %v", err)
    }
}

Penjelasan Kode

  • Membuka koneksi database SQLite.
  • Melakukan migrasi tabel User.
  • Menyimpan user awal ke database.
  • Memanggil UpdateSingleColumn untuk memperbarui nama user.
  • Jika terjadi error, unit test akan gagal.

3. Mengupdate Beberapa Kolom dengan Updates

Untuk memperbarui beberapa kolom sekaligus, gunakan metode Updates.

Contoh Implementasi

// UpdateMultipleColumns memperbarui beberapa kolom berdasarkan ID
func UpdateMultipleColumns(db *gorm.DB, id uint, updates map[string]interface{}) error {
    return db.Model(&User{}).Where("id = ?", id).Updates(updates).Error // Update beberapa kolom berdasarkan ID
}

Penjelasan Kode

  • updates map[string]interface{} memungkinkan pembaruan beberapa kolom sekaligus.
  • Where("id = ?", id) memilih user berdasarkan ID.
  • Updates(updates) memperbarui semua kolom yang ada di updates.

4. Mengupdate Field Tertentu dengan Select

Jika ingin memperbarui hanya kolom tertentu, gunakan Select dalam query.

Contoh Implementasi

// UpdateSelectedFields hanya memperbarui kolom tertentu berdasarkan ID
func UpdateSelectedFields(db *gorm.DB, id uint, name string) error {
    return db.Model(&User{}).Where("id = ?", id).Select("name").Updates(User{Name: name}).Error
}

Penjelasan Kode

  • Select("name") memastikan hanya kolom name yang diperbarui.
  • Updates(User{Name: name}) hanya menerapkan perubahan pada kolom yang dipilih.

3. Mengupdate Beberapa Kolom dengan Updates

Untuk memperbarui beberapa kolom sekaligus, gunakan metode Updates.

Contoh Implementasi

// UpdateMultipleColumns memperbarui beberapa kolom berdasarkan ID
func UpdateMultipleColumns(db *gorm.DB, id uint, updates map[string]interface{}) error {
    return db.Model(&User{}).Where("id = ?", id).Updates(updates).Error // Update beberapa kolom berdasarkan ID
}

Penjelasan Kode

  • updates map[string]interface{} memungkinkan pembaruan beberapa kolom sekaligus.
  • Where("id = ?", id) memilih user berdasarkan ID.
  • Updates(updates) memperbarui semua kolom yang ada di updates.

Unit Test

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

    user := User{Name: "John Doe", Email: "john@example.com"}
    db.Create(&user)

    updates := map[string]interface{}{"Name": "Updated Name", "Email": "updated@example.com"}
    err := UpdateMultipleColumns(db, user.ID, updates)
    if err != nil {
        t.Errorf("Gagal memperbarui beberapa kolom: %v", err)
    }
}

Penjelasan Kode

  • Membuka koneksi database SQLite.
  • Melakukan migrasi tabel User.
  • Menyimpan user awal ke database.
  • Mendefinisikan updates yang berisi perubahan data.
  • Memanggil UpdateMultipleColumns untuk memperbarui beberapa kolom user.
  • Jika terjadi error, unit test akan gagal.

4. Mengupdate Field Tertentu dengan Select

Jika ingin memperbarui hanya kolom tertentu, gunakan Select dalam query.

Contoh Implementasi

// UpdateSelectedFields hanya memperbarui kolom tertentu berdasarkan ID
func UpdateSelectedFields(db *gorm.DB, id uint, name string) error {
    return db.Model(&User{}).Where("id = ?", id).Select("name").Updates(User{Name: name}).Error
}

Penjelasan Kode

  • Select("name") memastikan hanya kolom name yang diperbarui.
  • Updates(User{Name: name}) hanya menerapkan perubahan pada kolom yang dipilih.

Unit Test

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

    user := User{Name: "John Doe", Email: "john@example.com"}
    db.Create(&user)

    err := UpdateSelectedFields(db, user.ID, "Updated Name")
    if err != nil {
        t.Errorf("Gagal memperbarui kolom yang dipilih: %v", err)
    }
}

Penjelasan Kode

  • Membuka koneksi database SQLite.
  • Melakukan migrasi tabel User.
  • Menyimpan user awal ke database.
  • Memanggil UpdateSelectedFields untuk memperbarui hanya kolom name.
  • Jika terjadi error, unit test akan gagal.

Dalam GORM, kita memiliki beberapa cara untuk melakukan update data tergantung kebutuhan, mulai dari menyimpan semua field, memperbarui satu atau beberapa kolom, hingga menggunakan hooks. Pastikan untuk menambahkan unit test agar setiap metode dapat dipastikan berjalan dengan benar.


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