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)