GORM provides various query methods. Here are the commonly used query methods explained in detail:
Basic Query Methods
1. First() - Query the first record
govar user User db.First(&user) // SELECT * FROM users ORDER BY id LIMIT 1 db.First(&user, 10) // SELECT * FROM users WHERE id = 10
2. Last() - Query the last record
govar user User db.Last(&user) // SELECT * FROM users ORDER BY id DESC LIMIT 1
3. Find() - Query multiple records
govar users []User db.Find(&users) // SELECT * FROM users db.Find(&users, []int{1, 2, 3}) // SELECT * FROM users WHERE id IN (1, 2, 3)
4. Take() - Get one record without specifying order
govar user User db.Take(&user) // SELECT * FROM users LIMIT 1
Conditional Queries
Where() - Add query conditions
godb.Where("name = ?", "John").First(&user) db.Where("name = ? AND age >= ?", "John", 18).Find(&users) db.Where(map[string]interface{}{"name": "John", "age": 30}).First(&user) db.Where(&User{Name: "John"}).First(&user)
Advanced Queries
Chainable queries
godb.Where("age > ?", 18). Order("age DESC"). Limit(10). Offset(5). Find(&users)
Or conditions
godb.Where("name = ?", "John").Or("name = ?", "Jane").Find(&users)
Not conditions
godb.Not("name = ?", "John").Find(&users)
In query
godb.Where("id IN ?", []int{1, 2, 3}).Find(&users)
Like query
godb.Where("name LIKE ?", "%John%").Find(&users)
Between query
godb.Where("age BETWEEN ? AND ?", 18, 30).Find(&users)
Sorting and Pagination
Order() - Sorting
godb.Order("age DESC").Find(&users) db.Order("age DESC, name ASC").Find(&users)
Limit() - Limit records
godb.Limit(10).Find(&users)
Offset() - Offset
godb.Offset(10).Limit(10).Find(&users) // Pagination query
Select Specific Fields
Select() - Select fields
godb.Select("name", "email").Find(&users) db.Select("name, email").Find(&users)
Aggregate Queries
Count() - Count
govar count int64 db.Model(&User{}).Where("age > ?", 18).Count(&count)
Pluck() - Extract single column
govar names []string db.Model(&User{}).Pluck("name", &names)
Raw SQL
Raw() - Execute raw SQL
godb.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)
Exec() - Execute raw SQL (no data returned)
godb.Exec("UPDATE users SET age = age + 1 WHERE id = ?", 1)
Notes
- First() vs Take(): First() sorts by primary key, Take() does not sort
- Query conditions: Use parameterized queries (?) to prevent SQL injection
- Performance optimization: Use indexes reasonably, limit query fields, avoid N+1 queries
- Error handling: Check
db.Errorto handle query errors - Preloading: Use Preload() to avoid performance issues with association queries