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 fieldID
,Name
, danEmail
. - Fungsi
SaveAllFields
menerima parameterdb
untuk koneksi database danuser
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 tabelUser
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
menerimaid
user danname
yang akan diperbarui. db.Model(&User{})
mengacu pada modelUser
.Where("id = ?", id)
mencari data berdasarkanid
.Update("name", name)
hanya memperbarui kolomname
.
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 diupdates
.
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 kolomname
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 diupdates
.
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 kolomname
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 kolomname
. - 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:
10 Advance Query Data Gorm Library (Bagian 2)
Artikel Terhangat
14 Menghapus (Delete) Data Gorm Library
03 Mar 2025
13 Advanced Update Data Gorm Library
03 Mar 2025
11 Update Data GORM Library
03 Mar 2025
08 Advanced Query dengan GORM di Golang
03 Mar 2025

14 Menghapus (Delete) Data Gorm Library

13 Advanced Update Data Gorm Library

11 Update Data GORM Library
