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

07 Query Data Gorm Library Lanjutan (Bagian 1)

· 4 mnt baca ·Ihsan Arif

Pelajari berbagai metode query lanjutan di GORM dengan Golang, termasuk Not Conditions, Selecting Fields, Order, Limit, Offset, dan lainnya. Dilengkapi contoh kode dan unit test.

Setelah membahas dasar-dasar query di GORM pada artikel sebelumnya, kali ini kita akan mendalami beberapa metode query lanjutan yang sering digunakan untuk mengelola data dengan lebih fleksibel. Setiap metode akan dilengkapi dengan fungsi dan unit test agar mudah dipahami dan diterapkan.


7. Not Conditions

Metode Not() digunakan untuk mengambil data yang tidak memenuhi kondisi tertentu. Contohnya, kita bisa mengambil semua user yang namanya bukan “John”.

Contoh Kode Fungsi

go
1func GetUsersNotNamed(db *gorm.DB, name string) ([]User, error) {
2    var users []User
3    result := db.Where("name <> ?", name).Find(&users)
4    return users, result.Error
5}

Penjelasan Kode Fungsi

  1. var users []User → Mendeklarasikan slice untuk menampung hasil query.
  2. db.Where("name <> ?", name).Find(&users) → Mengambil semua user yang namanya bukan name.
  3. return users, result.Error → Mengembalikan hasil query dan error jika ada.

Unit Test dengan SQLMock

go
 1func TestGetUsersNotNamed(t *testing.T) {
 2    db, mock, _ := sqlmock.New()
 3    gdb, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
 4    
 5    mock.ExpectQuery("SELECT \* FROM \"users\" WHERE name <> \$1").
 6        WithArgs("John").
 7        WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).AddRow(1, "Alice").AddRow(2, "Bob"))
 8    
 9    users, err := GetUsersNotNamed(gdb, "John")
10    assert.Nil(t, err)
11    for _, user := range users {
12        assert.NotEqual(t, "John", user.Name)
13    }
14}

Penjelasan Kode Unit Test

  1. Membuat database mock menggunakan SQLMock.
  2. Menentukan query yang diharapkan dijalankan oleh fungsi GetUsersNotNamed.
  3. Memasukkan data hasil query yang akan dikembalikan.
  4. Memanggil fungsi GetUsersNotNamed dan memverifikasi bahwa hasilnya sesuai.

8. Selecting Specific Fields

Metode Select() digunakan untuk memilih field tertentu dalam query agar lebih efisien.

Contoh Kode Fungsi

go
1func GetUserNames(db *gorm.DB) ([]string, error) {
2    var names []string
3    result := db.Model(&User{}).Select("name").Pluck("name", &names)
4    return names, result.Error
5}

Penjelasan Kode Fungsi

  1. db.Model(&User{}) → Menentukan tabel yang digunakan dalam query.
  2. .Select("name").Pluck("name", &names) → Mengambil hanya field name dan menyimpannya dalam slice names.
  3. return names, result.Error → Mengembalikan daftar nama dan error jika ada.

Unit Test dengan SQLMock

go
 1func TestGetUserNames(t *testing.T) {
 2    db, mock, _ := sqlmock.New()
 3    gdb, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
 4    
 5    mock.ExpectQuery("SELECT name FROM \"users\"").
 6        WillReturnRows(sqlmock.NewRows([]string{"name"}).AddRow("Alice").AddRow("Bob"))
 7    
 8    names, err := GetUserNames(gdb)
 9    assert.Nil(t, err)
10    assert.Greater(t, len(names), 0)
11}

Penjelasan Kode Unit Test

  1. Membuat database mock menggunakan SQLMock.
  2. Menentukan query yang diharapkan dijalankan oleh fungsi GetUserNames.
  3. Memasukkan data hasil query yang akan dikembalikan.
  4. Memanggil fungsi GetUserNames dan memverifikasi bahwa hasilnya sesuai.

9. Order

Metode Order() digunakan untuk mengurutkan hasil query berdasarkan field tertentu.

Contoh Kode Fungsi

go
1func GetUsersOrderedByAge(db *gorm.DB) ([]User, error) {
2    var users []User
3    result := db.Order("age desc").Find(&users)
4    return users, result.Error
5}

Penjelasan Kode Fungsi

  1. db.Order("age desc").Find(&users) → Mengambil user dan mengurutkannya berdasarkan age dari yang terbesar.
  2. return users, result.Error → Mengembalikan hasil query dan error jika ada.

Unit Test dengan SQLMock

go
 1func TestGetUsersOrderedByAge(t *testing.T) {
 2    db, mock, _ := sqlmock.New()
 3    gdb, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
 4    
 5    mock.ExpectQuery("SELECT \* FROM \"users\" ORDER BY age desc").
 6        WillReturnRows(sqlmock.NewRows([]string{"id", "age"}).AddRow(1, 40).AddRow(2, 30))
 7    
 8    users, err := GetUsersOrderedByAge(gdb)
 9    assert.Nil(t, err)
10    assert.GreaterOrEqual(t, users[0].Age, users[len(users)-1].Age)
11}

Penjelasan Kode Unit Test

  1. Membuat database mock menggunakan SQLMock.
  2. Menentukan query yang diharapkan dijalankan oleh fungsi GetUsersOrderedByAge.
  3. Memasukkan data hasil query yang akan dikembalikan.
  4. Memanggil fungsi GetUsersOrderedByAge dan memverifikasi bahwa hasilnya sesuai.

Dengan menggunakan SQLMock, kita dapat menguji kode tanpa harus benar-benar terhubung ke database. Ini memastikan bahwa fungsi bekerja seperti yang diharapkan dan hasil query dapat diverifikasi dengan lebih baik.

10. Limit & Offset

Metode Limit() dan Offset() digunakan untuk membatasi jumlah hasil query dan menentukan dari mana data diambil.

Contoh Kode Fungsi

go
1func GetLimitedUsers(db *gorm.DB, limit int, offset int) ([]User, error) {
2    var users []User
3    result := db.Limit(limit).Offset(offset).Find(&users)
4    return users, result.Error
5}

Penjelasan Kode Fungsi

  1. db.Limit(limit).Offset(offset).Find(&users) → Mengambil limit data dimulai dari offset tertentu.
  2. return users, result.Error → Mengembalikan hasil query dan error jika ada.

Unit Test dengan SQLMock

go
 1func TestGetLimitedUsers(t *testing.T) {
 2    db, mock, _ := sqlmock.New()
 3    gdb, _ := gorm.Open(postgres.New(postgres.Config{Conn: db}), &gorm.Config{})
 4    
 5    mock.ExpectQuery("SELECT \* FROM \"users\" LIMIT \$1 OFFSET \$2").
 6        WithArgs(5, 0).
 7        WillReturnRows(sqlmock.NewRows([]string{"id", "name"}).AddRow(1, "Alice").AddRow(2, "Bob"))
 8    
 9    users, err := GetLimitedUsers(gdb, 5, 0)
10    assert.Nil(t, err)
11    assert.LessOrEqual(t, len(users), 5)
12}

Penjelasan Kode Unit Test

  1. Membuat database mock menggunakan SQLMock.
  2. Menentukan query yang diharapkan dijalankan oleh fungsi GetLimitedUsers.
  3. Memasukkan data hasil query yang akan dikembalikan.
  4. Memanggil fungsi GetLimitedUsers dan memverifikasi bahwa hasilnya sesuai.

Selanjutnya, kita akan membahas Group By & Having, Join, Join Preloading, Join a Derived Table, dan Scan, dengan contoh kode dan unit test yang lengkap.

Untuk penjelasan lebih lanjut mengenai database dalam Golang, kunjungi:


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

💬 Komentar