节点JS 的点击之家客户端
点击之家 是使用SQL进行实时分析的开源高性能专栏OLAP数据库管理系统. 与 TypeScript 结合的 ClickHouse 帮助您在您的 ClickHouse 查询中开发更好的类型安全性, 并给予您端到端的打字功能 .
安装
安装以下软件包:
$ npm i --save @depyronick/clickhouse-client
快速启动
导入模块
一旦安装过程完成,您就可以导入 ClickHouseClient
const { ClickHouseClient } = require('@depyronick/clickhouse-client');
// or:
// import { ClickHouseClient } from '@depyronick/clickhouse-client';
const analyticsServer = new ClickHouseClient({
host: '127.0.0.1',
password: '7h3ul71m473p4555w0rd'
});
// you can create multiple clients
const chatServer = new ClickHouseClient({
host: '127.0.0.2',
password: '7h3ul71m473p4555w0rd'
});
new ClickHouseClient(options: ClickHouseOptions) 将创建具有指定连接选项的 ClickHouse 客户端.
见 点击之家选项 对象以获取更多信息.
方法
查询
ClickHouseClient.query<T>(query: string): Observable<string | T>
this.analyticsServer.query('SELECT * FROM visits LIMIT 10').subscribe({
error: (err) => {
// called when an error occurred during query
},
next: (row) => {
// if specified format is any of JSON formats, `row` here is the json representation of the row
// if format is not any of JSON, then `row` represents string chunk from http stream
},
complete: () => {
// called when stream is completed
}
});
ClickHouseClient.queryPromise<T>(query: string): Promise<string | T[]>
this.analyticsServer
.queryPromise('SELECT * FROM visits LIMIT 10')
.then((rows) => {
// if specified format is any of JSON formats, rows is an array of all retrieved rows
// if not, then rows is the raw string result from clickhouse-server
})
.catch((err) => {
// called when an error occurred during query
});
// or
const rows = await this.analyticsServer.queryPromise(
'SELECT * FROM visits LIMIT 10'
);
用参数查询
点击house-server支持使用参数执行查询. 两者 query 财务报告和审定财务报表 queryPromise 接受将查询参数值重新显示为 Record<string, string | number>。 。 。 .
查询中可以包含具有以下语法的参数占位符:
{<name>:<data type>}
-- a parameter called "limit" that will be interpreted as an 8-bit unsigned integer
{limit:UInt8}
因此,你可以通过参数如下:
SELECT * FROM visits LIMIT {limit:UInt8}
ClickHouseClient.query<T>(query: string, params: Record<string, string | number>): Observable<string | T>
const yersterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const params = {
yesterday: yesterday.getTime(),
osName: 'OSX'
};
const query =
'SELECT * FROM visits WHERE timestamp >= {yesterday:DateTime} AND os = {osName:String} LIMIT 10';
this.analyticsServer.query(query, params).subscribe({
error: (err) => {
// called when an error occurred during query
},
next: (row) => {
// if specified format is any of JSON formats, `row` here is the json representation of the row
// if format is not any of JSON, then `row` represents string chunk from http stream
},
complete: () => {
// called when stream is completed
}
});
ClickHouseClient.queryPromise<T>(query: string, params: Record<string, string | number>): Promise<string | T[]>
const yersterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const params = {
yesterday: yesterday.getTime(),
osName: 'OSX'
};
const query =
'SELECT * FROM visits WHERE timestamp >= {yesterday:DateTime} AND os = {osName:String} LIMIT 10';
this.analyticsServer
.queryPromise(query, params)
.then((rows) => {
// if specified format is any of JSON formats, rows is an array of all retrieved rows
// if not, then rows is the raw string result from clickhouse-server
})
.catch((err) => {
// called when an error occurred during query
});
// or
const rows = await this.analyticsServer.queryPromise(query, params);
插入
ClickHouseClient.insert<T>(table: string, data: T[]): Observable<void>
这个 insert 方法接受两个输入.
table是您要插入数据的表格的名称.- 表格值可以使用数据库的前缀, 如
analytics_db.visits。 。 。 .
- 表格值可以使用数据库的前缀, 如
data: T[]要插入的 JSON 对象数组.
analyticsServer
.insert('visits', [
{
timestamp: new Date().getTime(),
ip: '127.0.0.1',
os: 'OSX',
userAgent:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/95.0.4638.69 Safari/537.36',
version: '1.0.0'
}
])
.subscribe({
error: (err) => {
// called when an error occurred during insert
},
next: () => {
// currently next does not emits anything for inserts
},
complete: () => {
// called when insert is completed
}
});
ClickHouseClient.insertPromise<T>(table: string, data: T[]): Promise<void>
这个 insertPromise 方法接受的输入与 insert 惟你应当以约言回报,而不是以可观察的.
analyticsServer
.insertPromise('visits', [
{
timestamp: new Date().getTime(),
ip: '127.0.0.1',
os: 'OSX',
userAgent:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/95.0.4638.69 Safari/537.36',
version: '1.0.0'
}
])
.then(() => {
// insert was success
})
.catch((err) => {
// called when an error occurred during insert
});
ClickHouseClient.insertRaw(table: string, data: string | Buffer | Readable, format: ClickHouseDataFormat): Observable<void>
使用 insertRaw 以发送 CSV 或 JSONAsString 等预格式化数据.
// insert a raw JSON object into a single String column
await analyticsServer.insertRawPromise(
'sensor_raw',
'{"source":"test","uid":"test"}',
ClickHouseDataFormat.JSONAsString
);
// insert CSV payload
await analyticsServer.insertRawPromise(
'visits',
'timestamp,ip,os\n1700000000,127.0.0.1,OSX\n',
ClickHouseDataFormat.CSV
);
其它
ClickHouseClient.ping(timeout: number = 3000): Promise<boolean>
这个 ping 方法接受一个输入.
timeout是等待服务器发送 ping 响应的以毫秒计的时间Ok.\n。 。 。 .
// if you're using async/await
const ping = await analyticsServer.ping();
// or
analyticsServer
.then((pingResult) => {
// ping result is a boolean
// it will return `true` if we were able to receive `Ok.\n`
// and `false` if anything but `Ok.\n`
})
.catch((reason) => {
// reason is the full response of the error
// see more details at https://axios-http.com/docs/handling_errors
});
页:1
- 将积极维持和改进这一储存库.
- 计划执行 TCP 协议,如果 ClickHouse 决定 文档 这个.
- 计划执行带有流的插入.
- 这个库支持http响应压缩,如brotli,gzip和deflate等.
保持联系
- 作者 - 翻译 阿里·德米尔奇
许可证
麻省理工学院执照。 。 。 .