#!/usr/bin/env bash # Apply / drop ClickHouse DDL files in alphabetical order. # # Usage: # clickhouse_apply.sh up apply *.up.sql in infra/clickhouse/ # clickhouse_apply.sh down apply *.down.sql in REVERSE order # # Env: # CLICKHOUSE_ADDR (default localhost:9000) # CLICKHOUSE_DB (default cdp) # CLICKHOUSE_USER (default default) # CLICKHOUSE_PASSWORD (default empty) set -euo pipefail DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/clickhouse" ADDR="${CLICKHOUSE_ADDR:-localhost:9000}" DB="${CLICKHOUSE_DB:-cdp}" USER="${CLICKHOUSE_USER:-default}" PASS="${CLICKHOUSE_PASSWORD:-}" MODE="${1:-up}" host="${ADDR%%:*}" port="${ADDR##*:}" run_sql() { local file="$1" echo ">>> applying $(basename "$file")" if [[ -n "$PASS" ]]; then clickhouse-client --host "$host" --port "$port" --user "$USER" --password "$PASS" \ --database "$DB" --multiquery --queries-file "$file" else clickhouse-client --host "$host" --port "$port" --user "$USER" \ --database "$DB" --multiquery --queries-file "$file" fi } ensure_db() { if [[ -n "$PASS" ]]; then clickhouse-client --host "$host" --port "$port" --user "$USER" --password "$PASS" \ --query "CREATE DATABASE IF NOT EXISTS $DB" else clickhouse-client --host "$host" --port "$port" --user "$USER" \ --query "CREATE DATABASE IF NOT EXISTS $DB" fi } case "$MODE" in up) ensure_db for f in $(ls "$DIR"/*.up.sql 2>/dev/null | sort); do run_sql "$f" done ;; down) for f in $(ls "$DIR"/*.down.sql 2>/dev/null | sort -r); do run_sql "$f" done ;; *) echo "usage: $0 {up|down}" exit 1 ;; esac echo "done."