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))
}
반응형