golang

Golang ORM - Bun 삽질 이야기 - ScanAndCount

주먹불끈 2022. 12. 9. 22:39

Golang에서의 경량 ORM으로서의 bun package 다루며 경험한 내용을 정리해둔다.

 

ScanAndCount

 

링크: https://bun.uptrace.dev/guide/query-select.html#count-rows

 

데이터베이스를 다루며 query 리스트를 가져올 때에는 Offset, Limit 이용해 일부만을 가져와야 때가 많다. 그러면서도 paignation 위해 전체 개수를 Count 주어야 한다.

 

bun ScanAndCount() 기능을 제공한다. 매서드가 이쁜 것은 지점이다.

Offset, Limit 적용되면서도 Count 그것이 적용되지 않은 전체 개수를 세어주는 것이다.

 

Example code with comment

아래의 발췌한 코드와 코멘트로 설명을 마무리 한다.

 

전체 GitHub Repo: https://github.com/nicewook/bun-orm-study

ScanAndCount Example:  https://github.com/nicewook/bun-orm-study/blob/main/scan-count/main.go

 

// 아래와 같이 User 4명을 테이블에 추가하였다.
type User struct {
  bun.BaseModel `bun:"table:users,alias:u"`
  ID   int64  `bun:"id,pk,autoincrement"`
  Name string `bun:"name,notnull"`
}
var users = []User{ 
  {Name: "kim"},
  {Name: "song"},
  {Name: "park"},
  {Name: "han"},
}

// 추가한 User를 Query하고 개수를 확인한다
func main() {
  prepareDB()
  var myUsers []User
  
  // 전체 User를 query 한다. 4명의 User가 모두 Scan되고 Count값도 4가 된다.
  query := db.NewSelect().Model((*User)(nil))
  count, err := query.ScanAndCount(context.Background(), &myUsers)
  fmt.Printf("count: %v, err: %v\n", count, err)
  fmt.Println(prettyJson(myUsers))
  
  // 이번에는 Limit를 1로 두었다. 1명의 User만이 Scan되지만 Count값이 여전히 전체 개수인 4이다.
  count, err = query.Limit(1).ScanAndCount(context.Background(), &myUsers)
  fmt.Printf("count: %v, err: %v\n", count, err)
  fmt.Println(prettyJson(myUsers))
}
 
반응형