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

11 Update Data GORM Library

· 5 mnt baca ·Ihsan Arif

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

go
 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 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

go
 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.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

go
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 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

go
 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 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

go
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 di updates.

4. Mengupdate Field Tertentu dengan Select

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

Contoh Implementasi

go
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 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

go
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 di updates.

Unit Test

go
 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 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

go
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 kolom name yang diperbarui.
  • Updates(User{Name: name}) hanya menerapkan perubahan pada kolom yang dipilih.

Unit Test

go
 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 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:

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

💬 Komentar