# Отчет: Реализация отправки данных о пользователе в ClickHouse с использованием Go

## Введение
В рамках задачи было необходимо реализовать отправку данных о пользователе в ClickHouse с использованием языка программирования Go. В отчете описаны выполненные шаги, включая настройку окружения, создание таблицы в ClickHouse, написание кода на Go и проверку результатов.

## Выполненные действия

### Установка ClickHouse
Для начала работы с ClickHouse была выполнена его установка на сервер. Использовалась команда для Ubuntu/Debian:

```bash
sudo apt-get install clickhouse-server clickhouse-client
```

После установки сервер был запущен, и доступ к нему был проверен с помощью клиента clickhouse-client.

### Создание таблицы в ClickHouse
Для хранения данных о пользователях была создана таблица users с использованием следующего SQL-запроса:

```sql
CREATE TABLE users (
    user_id UInt32,
    name String,
    email String,
    registered_at DateTime
) ENGINE = MergeTree()
ORDER BY (user_id);
```

Таблица была успешно создана, и её структура проверена с помощью команды:

```sql
DESCRIBE users;
```

### Установка библиотеки clickhouse-go

Для работы с ClickHouse в Go была установлена библиотека clickhouse-go. Установка выполнена с помощью команды:

```bash
go get github.com/ClickHouse/clickhouse-go/v2
```

### Написание кода на Go
Был написан код на Go для отправки данных о пользователе в ClickHouse. Код включает следующие шаги:

1. Подключение к ClickHouse. 
2. Подготовка данных о пользователе. 
3. Выполнение SQL-запроса для вставки данных.

Код: 
```go
package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"
    "time"

    _ "github.com/ClickHouse/clickhouse-go/v2"
)

func main() {
    // Подключение к ClickHouse
    connect, err := sql.Open("clickhouse", "tcp://127.0.0.1:9000?username=default&password=&database=default")
    if err != nil {
        log.Fatalf("Ошибка подключения к ClickHouse: %v", err)
    }
    defer connect.Close()

    // Проверка соединения
    if err := connect.Ping(); err != nil {
        log.Fatalf("Ошибка проверки соединения: %v", err)
    }

    // Данные о пользователе
    userID := uint32(1)
    name := "John Doe"
    email := "john.doe@example.com"
    registeredAt := time.Now()

    // SQL-запрос для вставки данных
    query := `
        INSERT INTO users (user_id, name, email, registered_at)
        VALUES (?, ?, ?, ?)
    `

    // Выполнение запроса
    _, err = connect.ExecContext(context.Background(), query, userID, name, email, registeredAt)
    if err != nil {
        log.Fatalf("Ошибка при выполнении запроса: %v", err)
    }

    fmt.Println("Данные успешно отправлены в ClickHouse")
}
```

### Проверка данных в ClickHouse
После выполнения кода была выполнена проверка данных в таблице users с помощью SQL-запроса:

```sql
SELECT * FROM users;
```
Результат:
```
┌─user_id─┬─name─────┬─email────────────────┬────registered_at────┐
│       1 │ John Doe │ john.doe@example.com │ 2025-10-01 12:00:00 │
└─────────┴──────────┴──────────────────────┴─────────────────────┘
```

Данные были успешно добавлены в таблицу.

## Заключение
Задача по реализации отправки данных о пользователе в ClickHouse с использованием Go была успешно выполнена. Были выполнены следующие шаги: