Using SQL Expressions in ClickHouse HCL Schema
While Atlas supports defining engines as simple enums in HCL (like MergeTree or SharedMergeTree), many ClickHouse features require more complex configurations. Atlas provides the sql() function to handle these advanced scenarios.
Database & Table Engines with Parameters
For engines that require parameters, you can use SQL expressions:
schema "default" {
engine = sql("Replicated('/clickhouse/schemas/{cluster}', '{replica}')")
}
table "distributed_users" {
schema = schema.default
engine = sql("Distributed('{cluster}', 'my_database', 'users')")
column "id" {
type = UInt64
}
column "name" {
type = String
}
}
table "replicated_users" {
schema = schema.default
engine = sql("ReplicatedMergeTree('/clickhouse/tables/{cluster}/users', '{replica}')")
column "id" {
type = UInt64
}
}
Other Attributes Supporting SQL Expressions
Beyond engines, several other attributes support sql() expressions:
Column Types and Defaults
table "advanced_example" {
schema = schema.default
engine = MergeTree
column "data" {
type = sql("Nested(name String, value UInt32)") # Complex nested type
}
column "created_at" {
type = DateTime
default = sql("now()") # Function-based default
}
column "computed_field" {
type = String
default = sql("concat('prefix_', toString(id))")
default_kind = MATERIALIZED
}
}
TTL Expressions
table "time_series_data" {
schema = schema.default
engine = MergeTree
ttl = sql("created_at + INTERVAL 30 DAY") # Table-level TTL
column "metadata" {
type = String
ttl = sql("timestamp + INTERVAL 7 DAY") # Column-level TTL
}
}
Use sql() expressions when you need complex ClickHouse configurations that go beyond basic enums and types.