1.0.0 • Published 8 months ago
lite-clickhouse-orm v1.0.0
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