Skip to content

Repository files navigation

click: Golang ClickHouse query SQL builder

Go ReferenceGo Report

1. design overview

  • declarative builder: build ClickHouse SQL declaratively, in simple or advanced ways
  • type-safe: static-typed, extensible SQL template for code reuse
  • feel-like-home: SQL-like, idiomatic Go, no bloated stuff
  • easy to extend & interoperate with:
    • good interoperability with existing popular ORM library (github.com/huandu/go-sqlbuilder)
    • directly generate final query SQL, easy to use outside the library
  • well-tested: test coverage ~87%
    • test coverage

2. features & modules

  1. querybuilder:
    • SimpleQuery: non-nested query shortcut, build with struct
    • Select(): declarative, chained, freestyle builder
  2. expression: fundamental SQL expressions and operators
    • expressions & functions: GreaterThan, LessThan, In, If, ...
    • operators: And, Or, Concatenate

2. examples

2.1 click 101

package main
import (
"fmt""github.com/keuin/click"
)
const (
Date click.Column="date"User click.Column="user"
)
funcmain() {
sumVisitCount:=click.Alias("visit_count")
sql, _:=click.
Select(Date, User, click.As(click.Count(), sumVisitCount)).
From(click.Table("user_accesses")).
GroupBy(Date, User).
OrderBy(sumVisitCount).
Limit(10).PrettyPrint().BuildString()
fmt.Println(sql)
}
SELECTdate,
user,
count() AS visit_count
FROM
user_accesses
GROUP BYdate,
user
ORDER BY
visit_count
LIMIT10

2.2 nested query

package main
import (
"fmt"
. "github.com/keuin/click"
)
const (
DateColumn="date"ScoreColumn="score"TblTable="tbl"
)
funcmain() {
avgScore:=As(Avg(Score), LiteralExpression("avg_score"))
sql, _:=Select(Count()).
From(
Select(avgScore).
From(Tbl).
Sample(0.1).
Where(And(
GreaterOrEqualThan(Date, LiteralExpressionQuoted("2024-01-01")),
LessThan(Date, LiteralExpressionQuoted("2024-02-01")),
)).
GroupBy(Date).
OrderBy(Date, Asc(Date), Desc(avgScore)).
Having(GreaterThan(avgScore, LiteralExpression(60))).
Limit(5).Offset(10),
).
PrettyPrint().BuildString()
fmt.Println(sql)
}
SELECTcount()
FROM
(
SELECTavg(score) AS avg_score
FROM
tbl
SAMPLE
0.1WHERE
((date>='2024-01-01') AND (date<'2024-02-01'))
GROUP BYdateHAVING
(avg_score >60)
ORDER BYdate,
dateASC,
avg_score DESCLIMIT5
OFFSET
10
)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages