Golang/ORM

[GORM] Query

GenieLove! 2022. 9. 28. 12:45
728x90
반응형

Query

기본

type User struct {
	ID uint
    Name string
    Age int
}

var users []User
db.Model(&user{}).Find(&users) // user에 대한 모든 데이터 출력

Map으로 찾기

var results []map[string]any
db.Model(&User{}).Find(&results)//key : column명, value : 값으로 매칭되어 map slice로 들어가게 된다.

FirstOrInit

db.FirstOrInit(&user, User{Name: "none_existing"})

db.FirstOrInit(&user, User{Name: "soomin"})

// User데이터 존재 시 DB에서 first(order by Id)로 객체를 찾아 반환하고, 
// 없을 시 user 변수에 User{Name: 설정한 이름}으로 기본 초기화 되어 저장된다. DB는 저장 X user변수에만 저장

CreateInBatches

db.Where(User{Name: "soomin"}).CreateInBatches(&users, 100)
// 생성 시 배치를 통해 일괄작업을 할 수 있다.

Pluck

var ages []int64

db.Model(&User{}).Pluck("age", &ages)
// -> 하나의 컬럼을 슬라이스로 추출하고 싶을 때 사용
// -> 여러 컬럼을 슬라이스로 추출하고 싶을 땐 Find, Scan을 사용하면 된다.

Hooks

Create

- create, query, upate, delete 전 후에 호출되는 함수다.

- 트랜잭션에 맞게 에러 시 같이 롤백 된다.

  • BeforeSave - 저장하기 전에 일어나는 함수
  • BeforeCreate - 생성되기 전에 일어나는 함수
  • AfterCreate - 생성된 후에 일어나는 함수
  • AfterSave - 저장하기 전에 일어나는 함수

- 순서

  1. 트랜잭션 시작
  2. BeforeSave
  3. BeforeCreate
  4. DB 연결 전 저장
  5. 데이터베이스에 삽입
  6. DB 연결 후 저장
  7. AfterCreate
  8. AfterSave
  9. commit or rollback
func (u *User)BeforeCreate(tx *gorm.DB) (err error) {
	//code
    ...
}

Update

- 순서

  1. 트랜잭션 시작
  2. BefroeSave
  3. BeforeUpdate
  4. DB 연결 전 저장
  5. DB 업데이트
  6. DB 연결 후 저장
  7. AfterUpdate
  8. AfterSave
  9. commit or rollback

Delete

- 순서

  1. 트랜잭션 시작
  2. BefroeDekete
  3. DB 에서 삭제
  4. AfterDelete
  5. commit or rollback

Find

- 순서

  1. DB에서 Find
  2. AfterFind
728x90
반응형

'Golang > ORM' 카테고리의 다른 글

[Entgo] Hooks 사용 시 주의  (0) 2023.03.23
[Entgo] Hooks  (1) 2022.12.07
[Entgo] CRUD API(작성 중)  (0) 2022.09.12
[Entgo] About Annotations  (0) 2022.09.03
[Entgo] About Mixin  (0) 2022.09.01