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
Usermerepresentasikan tabel dalam database dengan fieldID,Name, danEmail. - Fungsi
SaveAllFieldsmenerima parameterdbuntuk koneksi database danusersebagai data yang akan disimpan. db.Save(user).Errordigunakan 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.Openmenggunakan SQLite. db.AutoMigrate(&User{})memastikan tabelUsersudah 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
UpdateSingleColumnmenerimaiduser dannameyang 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
UpdateSingleColumnuntuk 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 kolomnameyang 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
updatesyang berisi perubahan data. - Memanggil
UpdateMultipleColumnsuntuk 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 kolomnameyang 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
UpdateSelectedFieldsuntuk 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.