GORM 주요 메서드
GORM은 Go 언어의 강력한 ORM 라이브러리로, 데이터베이스와의 상호작용을 간편하게 만듭니다. 아래는 주요 메서드와 사용 예제를 기능별로 정리한 내용입니다.
데이터 생성
Create
새로운 레코드를 데이터베이스에 삽입합니다.
user := User{Name: "John", Age: 30}
db.Create(&user)
데이터 조회
First
조건에 맞는 첫 번째 레코드를 가져옵니다.
var user User
db.First(&user) // 첫 번째 레코드
db.First(&user, 1) // ID가 1인 레코드
db.First(&user, "id = ?", 2) // 조건을 사용한 검색
Find
조건에 맞는 여러 레코드를 가져옵니다.
var users []User
db.Find(&users) // 모든 레코드
db.Find(&users, "age > ?", 20) // 조건에 맞는 레코드
Where
조건에 맞는 레코드를 필터링합니다.
var users []User
db.Where("name = ?", "John").Find(&users) // 이름이 John인 레코드
db.Where("age BETWEEN ? AND ?", 18, 30).Find(&users) // 나이가 18~30인 레코드
데이터 수정
Update
특정 필드를 업데이트합니다.
db.Model(&user).Update("name", "Updated Name") // 단일 필드 업데이트
db.Model(&user).Updates(User{Name: "John", Age: 35}) // 여러 필드 업데이트
데이터 삭제
Delete
레코드를 삭제합니다.
db.Delete(&user) // 특정 레코드 삭제
db.Delete(&User{}, 10) // ID가 10인 레코드 삭제
SQL 직접 실행
Raw
SQL 쿼리를 실행하고 결과를 매핑합니다.
var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 20).Scan(&users)
Exec
SQL 쿼리를 실행하고, 결과를 반환하지 않습니다.
db.Exec("DELETE FROM users WHERE age < ?", 18)
db.Exec("UPDATE users SET age = ? WHERE name = ?", 30, "John")
db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Jane", 25)
고급 기능
Joins
SQL JOIN을 수행합니다.
var users []User
db.Joins("INNER JOIN orders ON orders.user_id = users.id").Find(&users)
Preload
관계 데이터를 미리 로드합니다.
db.Preload("Orders").Find(&users) // 사용자와 함께 주문 데이터 로드
Transaction
트랜잭션을 처리합니다.
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&user).Error; err != nil {
return err
}
if err := tx.Save(&order).Error; err != nil {
return err
}
return nil
})
if err != nil {
log.Fatal("Transaction failed:", err)
}
결과 제어
Order
결과를 정렬합니다.
db.Order("age desc").Find(&users) // 나이 내림차순
db.Order("name asc").Find(&users) // 이름 오름차순
Limit
결과의 개수를 제한합니다.
db.Limit(5).Find(&users) // 최대 5개의 레코드
Offset
결과의 시작 위치를 지정합니다.
db.Offset(5).Limit(5).Find(&users) // 6번째부터 5개의 레코드
Count
레코드의 개수를 반환합니다.
var count int64
db.Model(&User{}).Where("age > ?", 20).Count(&count) // 나이가 20 이상인 사용자 수