Defining models
Mapping tables to structs
For each table you need to define a corresponding Go struct (model). go-clickhouse maps the exported struct fields to the table columns and ignores the unexported fields.
type Span struct {
ch.CHModel `ch:"table:spans,partition:toYYYYMM(time)"`
ID uint64
Text string `ch:",lc"` // low cardinality column
Time time.Time `ch:",pk"` // ClickHouse primary key for order by
email string // unexported fields are ignored
}
Struct tags
Ch uses sensible defaults to generate names and deduct types, but you can use the following struct tags to override the defaults.
| Tag | Comment |
|---|---|
| ch.CHModel `ch:"table:table_name"` | Override default table name. |
| ch.CHModel `ch:"alias:table_alias"` | Override default table alias. |
| ch.CHModel `ch:"insert:table_name_buffer"` | Override table name for INSERT queries. |
| ch:"-" | Ignore the field. |
| ch:"column_name" | Override default column name. |
| ch:"alt:alt_name" | Alternative column name. Useful during migrations. |
| ch:",pk" | Mark column as a ClickHouse primary key (order by). |
| ch:"type:uuid" | Override default SQL type. |
| ch:"default:gen_random_uuid()" | Tell CreateTable to set DEFAULT expression. |
| ch:",notnull" | Tell CreateTable to add NOT NULL constraint. |
| ch:",scanonly" | Only use this field to scan query results, not for inserts. |
| ch:",array" | Use PostgreSQL array. |
| ch:",json_use_number" | Use json.Decoder.UseNumber to decode JSON. |
Table names
Ch generates table names and aliases from struct names by underscoring them. It also pluralizes table names, for example, struct ArticleCategory gets table name article_categories and alias article_category.
To override the generated name and the alias:
type Span struct {
ch.CHModel `ch:"table:spans,alias:s"`
}
To specify a different table name for INSERT queries:
type Span struct {
ch.CHModel `ch:"table:spans,insert:spans_buffer,alias:s"`
}
Column names
Ch generates column names from struct field names by underscoring them. For example, struct field UserID gets column name user_id.
To override the generated column name:
type Span struct {
Name string `ch:"myname"`
}
Column types
go-clickhouse generates column types from the struct field types. For example, Go type string is translated to ClickHouse type String.
To override the generated column type:
type Span struct {
ID int64 `ch:"type:UInt64"`
}
Low cardinality
To use LowCardinality(String) ClickHouse type, add the lc tag option or specify the type on the field, for example:
type Span struct {
Name string `ch:",lc"`
}
// or
type Span struct {
Name string `ch:"type:LowCardinality(String)"`
}
Nullable
To use Nullable(T) ClickHouse data type, define a model with a pointer to the corresponding Go type, for example, Nullable(String) and *string:
type Span struct {
Name *string
}
