1.0.0 • Published 8 months ago

lite-clickhouse-orm v1.0.0

Weekly downloads
-
License
ISC
Repository
-
Last release
8 months ago

Lite-clickhouse-orm

Псевдо ORM для совместимой работы разработчиков которые привыкли к Sequlize

Пример поддерживающих параметров окружения "env"

CH_MIGRATIONS_PATH=./chb/migrations
CH_USER=default
CH_PASS=password
CH_DATABASE=default
CH_HOST=127.0.0.1
CH_PORT=8123

Пример подключения и создания инстанса ClickHouse

const ClickhouseORM = require('lite-clickhouse-orm');

const clickhouse = new ClickhouseORM.ClickHouse({
    typeConnector: 'http',
    url: process.env.CH_HOST,
    port: process.env.CH_PORT,
    debug: false,
    basicAuth: {
        username: process.env.CH_USER,
        password: process.env.CH_PASS,
    },
    isUseGzip: true,
    trimQuery: false,
    usePost: true,
    format: 'json', // "json" || "csv" || "tsv"
    raw: false,
    config: {
        // session_id                              : 'session_id if neeed',
        session_timeout: 60,
        output_format_json_quote_64bit_integers: 0,
        enable_http_compression: 1,
        database: process.env.CH_DATABASE,
    },
    // This object merge with request params (see request lib docs)
    // reqParams: {
    //     ...
    // }
});

Пример файла миграции

module.exports = {
    up: async (queryInterface, clickhouseORM) => {
        const { DataTypes } = clickhouseORM;
        await queryInterface.createTable(
            'HttpLog',
            {
                date: {
                    type: DataTypes.DATETIME64,
                    primaryKey: true,
                },
                server: {
                    type: DataTypes.LOWCARDINALITY,
                    level: DataTypes.STRING,
                },
                typeMessage: {
                    type: DataTypes.LOWCARDINALITY,
                    level: DataTypes.STRING,
                },

                method: {
                    type: DataTypes.LOWCARDINALITY,
                    level: DataTypes.STRING,
                },
                url: {
                    type: DataTypes.LOWCARDINALITY,
                    level: DataTypes.STRING,
                },
                originalUrl: {
                    type: DataTypes.LOWCARDINALITY,
                    level: DataTypes.STRING,
                },
                params: DataTypes.STRING,
                query: DataTypes.STRING,
                startTime: DataTypes.DATETIME64,
                cookies: DataTypes.STRING,
                signedCookies: DataTypes.STRING,
            },
            {
                engine: 'MergeTree', // (date, (mark, time), 8192)
                sqlAppend: [
                    // 'OPTIMIZE TABLE ukit.loadstat PARTITION 201807 FINAL'
                ],
            },
        );
    },
    down: async (queryInterface, clickhouseORM) => {
        await queryInterface.dropTable('HttpLog');
    },
};

Пример файла модели

const { Model } = require('lite-clickhouse-orm');

module.exports = (clickhouse, DataTypes) => {
    class HttpLog extends Model {
        static associate(models) {
            // define association here
        }
    }

    HttpLog.init(
        {
            date: DataTypes.DATETIME64,
            server: {
                type: DataTypes.LOWCARDINALITY,
                level: DataTypes.STRING,
            },
            typeMessage: {
                type: DataTypes.LOWCARDINALITY,
                level: DataTypes.STRING,
            },

            method: {
                type: DataTypes.LOWCARDINALITY,
                level: DataTypes.STRING,
            },
            url: {
                type: DataTypes.LOWCARDINALITY,
                level: DataTypes.STRING,
            },
            originalUrl: {
                type: DataTypes.LOWCARDINALITY,
                level: DataTypes.STRING,
            },
            params: DataTypes.TEXT,
            query: DataTypes.TEXT,
            startTime: DataTypes.DATETIME64,
            cookies: DataTypes.TEXT,
            signedCookies: DataTypes.TEXT,
        },
        {
            clickhouse,
            modelName: 'HttpLog',
            schema: 'default',
            freezeTableName: true,
        },
    );
    return HttpLog;
};

В данной версии поддерживаются функции:

  • findOne - поиск одного значения (аналогично findAll с опцией limit=1)
  • findAll - поиск значений
  • create - добавление записи в таблицу
  • bulkCreate - добавление массива записей в таблицу
  • query - произвольный запрос

Пример использования

const { HttpLog } = require('../models');

const TableList = await HttpLog.findAll({
    attributes: [
        'server',
        ['originalUrl', 'user_url'],
        [clickhouse.fn('count', clickhouse.col('originalUrl')), 'count_page'],
        [
            clickhouse.fn('has', clickhouse.fn('splitByString', "'/'", clickhouse.col('originalUrl')), "'dynpage'"),
            'dynpage',
        ],
        [
            clickhouse.fn(
                'hasAny',
                clickhouse.fn('splitByString', "'/'", clickhouse.col('originalUrl')),
                "['settings', 'meta', 'render', 'breadcrumbs']",
            ),
            'service',
        ],
    ],
    where: {
        dynpage: 1,
        service: 0,
    },
    order: [['count_page', 'DESC']],
    group: ['server', 'user_url'],
    offset: 0,
    limit: 20,
});
return TableList;
}
const values = [];
const lineObject = {
    date: '',
    server: 'localhost',
    typeMessage: 'GET'
    method: 'GET'
    url: 'http://localhost',
    originalUrl: 'http://localhost',
    params: '{ "q1": 1, "q2": 2 }',
    query: '?p1=1&p2=2'
}
values.push(lineObject);
const result = await HttpLog.bulkCreate(values);
1.0.0

8 months ago