Clickhouse

установка

sudo apt update
sudo apt upgrade
sudo apt install apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754
echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \
    /etc/apt/sources.list.d/clickhouse.list
sudo apt update
sudo apt install clickhouse-server clickhouse-client

запуск

sudo service clickhouse-server start
sudo service clickhouse-server enable
sudo service clickhouse-server status

подключение

clickhouse-client --password --multiline

создание баз данных

CREATE DATABASE mydb;
USE mydb;

удаление баз данных

DROP DATABASE mydb;

отобразить существующие базы данных

SHOW DATABASES;

создание таблиц (конфигурирование столбцов)

  • MergeTree - тип движка
CREATE TABLE mytable (
   id UInt64,
   val Float64,
   wrd String,
   dt DateTime
   ) ENGINE = MergeTree() 
   PRIMARY KEY id 
   ORDER BY id;

удаление таблиц

DROP TABLE mytable;

отобразить сузествующие таблицы

SHOW TABLES;

вставка, обновление и удаление данных (добавление строк)

INSERT INTO mytable VALUES (1, 11.1, 'string 1', '2022-01-01 01:01:01');
INSERT INTO mytable VALUES (2, 22.2, 'string 2', '2022-02-02 02:02:02');

добавление столбца в существующую таблицу

ALTER TABLE mytable ADD COLUMN desc String;

обновление данных в строках

ALTER TABLE mytable UPDATE wrd = 'Updated String' WHERE val > 30;

удаление строк

ALTER TABLE mytable DELETE WHERE val < 20;

удаление столбца

ALTER TABLE mytable DROP COLUMN desc;

запрос данных

SELECT val, wrd FROM mytable WHERE wrd = 'Updated String';

аггрегационный запрос (вернет сумму значений в столбце var)

SELECT SUM(val) FROM mytable;

по умолчанию база данных доступна только по localhost:9000

чтобы это исправить необходипо в файле

sudo nano /etc/clickhouse-server/config.xml

добавить/изменить

<listen_host>::</listen_host>

Python код для проверки соединения с базой

# scada использует 9000 порт
import clickhouse_connect

client = clickhouse_connect.get_client(
    host='10.8.0.101',
    port=8123,
    username='default',
    password='2589',
    database='mydb'
)

print('successful')

Python ко для перевода наносекунд в человекочитаемую дату

import datetime


# остортированное по DESK самое свежее самое верхнее значение
timestamp = 133935155119850149 
seconds = timestamp / 10_000_000  # в секунды
epoch_start = datetime.datetime(1601, 1, 1)
utc_time = epoch_start + datetime.timedelta(seconds=seconds)
msk_time = utc_time + datetime.timedelta(hours=3)  # UTC+3

print("UTC:", utc_time)
print("MSK (Москва):", msk_time)


# соритировка по DESK это от самых свежих к самым старым
# сортировка по ASK от самых старых к самым свежим

Обратное преобразование

import datetime

def datetime_to_filetime(dt):
    # Убедимся, что время в UTC (если нужно MSK → UTC, вычитаем 3 часа)
    if dt.tzinfo is not None:
        dt = dt.astimezone(datetime.timezone.utc).replace(tzinfo=None)
    # Начало эпохи FILETIME (1601-01-01)
    epoch = datetime.datetime(1601, 1, 1)
    # Разница между датой и эпохой
    delta = dt - epoch
    # Переводим в 100-наносекундные интервалы
    filetime = delta.total_seconds() * 10_000_000
    return int(filetime)

# Пример: Московское время (2025-06-04 16:04:29.524006)
msk_time = datetime.datetime(2025, 6, 4, 16, 4, 29, 524006)
utc_time = msk_time - datetime.timedelta(hours=3)  # Переводим в UTC
timestamp = datetime_to_filetime(utc_time)

print("Исходная дата (MSK):", msk_time)
print("Соответствующий timestamp:", timestamp)