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
1package main
2
3import (
4 "gorm.io/driver/sqlite"
5 "gorm.io/gorm"
6 "log"
7 "testing"
8)
9
10// User merepresentasikan tabel users dalam database
11type User struct {
12 ID uint `gorm:"primaryKey"` // ID sebagai primary key
13 Name string // Nama user
14 Email string // Email user
15}
16
17// SaveAllFields menyimpan semua field user ke database
18func SaveAllFields(db *gorm.DB, user *User) error {
19 return db.Save(user).Error // Menyimpan user ke database, baik data baru maupun yang diperbarui
20}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
1func TestSaveAllFields(t *testing.T) {
2 db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) // Membuka koneksi database SQLite
3 db.AutoMigrate(&User{}) // Melakukan migrasi tabel User
4
5 user := User{Name: "John Doe", Email: "john@example.com"}
6 db.Create(&user) // Menyimpan user baru
7
8 user.Name = "Updated Name" // Mengubah nama user
9 err := SaveAllFields(db, &user) // Menyimpan perubahan ke database
10 if err != nil {
11 t.Errorf("Gagal menyimpan user: %v", err) // Menampilkan error jika penyimpanan gagal
12 }
13}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
1// UpdateSingleColumn memperbarui satu kolom berdasarkan ID
2func UpdateSingleColumn(db *gorm.DB, id uint, name string) error {
3 return db.Model(&User{}).Where("id = ?", id).Update("name", name).Error // Update kolom name berdasarkan ID
4}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
1func TestUpdateSingleColumn(t *testing.T) {
2 db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
3 db.AutoMigrate(&User{})
4
5 user := User{Name: "John Doe", Email: "john@example.com"}
6 db.Create(&user) // Membuat user baru
7
8 err := UpdateSingleColumn(db, user.ID, "New Name") // Memperbarui nama user
9 if err != nil {
10 t.Errorf("Gagal memperbarui satu kolom: %v", err)
11 }
12}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
1// UpdateMultipleColumns memperbarui beberapa kolom berdasarkan ID
2func UpdateMultipleColumns(db *gorm.DB, id uint, updates map[string]interface{}) error {
3 return db.Model(&User{}).Where("id = ?", id).Updates(updates).Error // Update beberapa kolom berdasarkan ID
4}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
1// UpdateSelectedFields hanya memperbarui kolom tertentu berdasarkan ID
2func UpdateSelectedFields(db *gorm.DB, id uint, name string) error {
3 return db.Model(&User{}).Where("id = ?", id).Select("name").Updates(User{Name: name}).Error
4}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
1// UpdateMultipleColumns memperbarui beberapa kolom berdasarkan ID
2func UpdateMultipleColumns(db *gorm.DB, id uint, updates map[string]interface{}) error {
3 return db.Model(&User{}).Where("id = ?", id).Updates(updates).Error // Update beberapa kolom berdasarkan ID
4}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
1func TestUpdateMultipleColumns(t *testing.T) {
2 db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
3 db.AutoMigrate(&User{})
4
5 user := User{Name: "John Doe", Email: "john@example.com"}
6 db.Create(&user)
7
8 updates := map[string]interface{}{"Name": "Updated Name", "Email": "updated@example.com"}
9 err := UpdateMultipleColumns(db, user.ID, updates)
10 if err != nil {
11 t.Errorf("Gagal memperbarui beberapa kolom: %v", err)
12 }
13}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
1// UpdateSelectedFields hanya memperbarui kolom tertentu berdasarkan ID
2func UpdateSelectedFields(db *gorm.DB, id uint, name string) error {
3 return db.Model(&User{}).Where("id = ?", id).Select("name").Updates(User{Name: name}).Error
4}Penjelasan Kode
Select("name")memastikan hanya kolomnameyang diperbarui.Updates(User{Name: name})hanya menerapkan perubahan pada kolom yang dipilih.
Unit Test
1func TestUpdateSelectedFields(t *testing.T) {
2 db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
3 db.AutoMigrate(&User{})
4
5 user := User{Name: "John Doe", Email: "john@example.com"}
6 db.Create(&user)
7
8 err := UpdateSelectedFields(db, user.ID, "Updated Name")
9 if err != nil {
10 t.Errorf("Gagal memperbarui kolom yang dipilih: %v", err)
11 }
12}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.