说明
点击之家 是使用SQL进行实时分析的开源高性能专栏OLAP数据库管理系统. 点击之家组合 类型脚本 帮助您用您的 ClickHouse 查询来开发更好的类型安全, 并给予您端到端的打字功能 .
安装
安装以下软件包:
$ npm i --save @depyronick/nestjs-clickhouse
快速启动
此 NestJS 模块是用于 @depyronick/ 点击之家- 客户端。您可以在那里找到方法的最新文档.
导入模块
一旦安装过程完成,我们就可以导入 ClickHouseModule 输入根 AppModule。 。 。 .
import { Module } from '@nestjs/common';
import { ClickHouseModule } from '@depyronick/nestjs-clickhouse';
@Module({
imports: [
ClickHouseModule.register([
{
name: 'ANALYTICS_SERVER',
host: '127.0.0.1',
password: '7h3ul71m473p4555w0rd',
},
]),
],
})
export class AppModule {}
这个 register() 方法将注册具有指定连接选项的 ClickHouse 客户端.
见 点击之家选项 对象以获取更多信息.
每个注册客户应当有一个独特的 name 定义。 默认值 name 属性是 CLICKHOUSE_DEFAULT。该财产将用作注射标志.
与 ClickHouse 客户端交互
要与您刚刚注册的 ClickHouse 服务器交互, 请使用注射符注入您的课程 .
constructor(
@Inject('ANALYTICS_SERVER')
private analyticsServer: ClickHouseClient
) {}
这个
ClickHouseClient类别从@depyronick/nestjs-clickhouse。 。 。 .
实例
这些只是几个例子,请参见: @depyronick/ 点击之家- 客户端 用于更新方法,例如 参数化查询能力。 。 。 .
ClickHouseClient.query<T>(query: string): Observable<T>
import { Inject, Injectable } from '@nestjs/common';
import { ClickHouseClient } from '@depyronick/nestjs-clickhouse';
interface VisitsTable {
timestamp: number;
ip: string;
userAgent: string;
os: string;
version: string;
// ...
}
@Injectable()
export class AppService {
constructor(
@Inject('ANALYTICS_SERVER')
private readonly analyticsServer: ClickHouseClient,
) {
this.analyticsServer
.query<VisitsTable>('SELECT * FROM visits LIMIT 10')
.subscribe({
error: (err: any): void => {
// called when an error occurred during query
},
next: (row): void => {
// called for each row
// the type of row property here is VisitsTable
},
complete: (): void => {
// called when stream is completed
},
});
}
}
ClickHouseClient.queryPromise<T>(query: string): Promise<T[]>
import { Inject, Injectable } from '@nestjs/common';
import { ClickHouseClient } from '@depyronick/nestjs-clickhouse';
interface VisitsTable {
timestamp: number;
ip: string;
userAgent: string;
os: string;
version: string;
// ...
}
@Injectable()
export class AppService {
constructor(
@Inject('ANALYTICS_SERVER')
private readonly analyticsServer: ClickHouseClient,
) {
this.analyticsServer
.queryPromise<VisitsTable>('SELECT * FROM visits LIMIT 10')
.then((rows: VisitsTable[]) => {
// all retrieved rows
})
.catch((err) => {
// called when an error occurred during query
});
// or
const rows = await this.analyticsServer.queryPromise(
'SELECT * FROM visits LIMIT 10',
);
}
}
ClickHouseClient.insert<T>(table: string, data: T[]): Observable<any>
这个 insert 方法接受两个输入.
table是您要插入数据的表格的名称.- 表格值可以使用数据库的前缀, 如
analytics_db.visits。 。 。 .
- 表格值可以使用数据库的前缀, 如
data: T[]要插入的 JSON 对象数组.
import { Inject, Injectable } from '@nestjs/common';
import { ClickHouseClient } from '@depyronick/nestjs-clickhouse';
interface VisitsTable {
timestamp: number;
ip: string;
userAgent: string;
os: string;
version: string;
// ...
}
@Injectable()
export class AppService {
constructor(
@Inject('ANALYTICS_SERVER')
private readonly analyticsServer: ClickHouseClient,
) {
this.analyticsServer
.insert<VisitsTable>('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: any): void => {
// called when an error occurred during insert
},
next: (): void => {
// currently next does not emits anything for inserts
},
complete: (): void => {
// called when insert is completed
},
});
}
}
多个客户端
您可以在同一应用程序中注册多个客户端如下:
@Module({
imports: [
ClickHouseModule.register([
{
name: 'ANALYTICS_SERVER',
host: '127.0.0.1',
password: '7h3ul71m473p4555w0rd',
},
{
name: 'CHAT_SERVER',
host: '192.168.1.110',
password: 'ch5ts3rv3Rp455w0rd',
},
]),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
然后你可以使用这些服务器的指定注射符进行交互.
constructor(
@Inject('ANALYTICS_SERVER')
private analyticsServer: ClickHouseClient,
@Inject('CHAT_SERVER')
private chatServer: ClickHouseClient
) { }
Async 注册和Async 供应商
例如,如果您想要等待应用程序接受新的连接,直到从同步目标收到点击之家所需的配置设置,您就可以使用 registerAsync 方法.
import { Inject, Module } from '@nestjs/common';
import { ClickHouseModule } from '@depyronick/nestjs-clickhouse';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: ['.development.env'],
isGlobal: true,
}),
ClickHouseModule.registerAsync({
useFactory: (config: ConfigService) => {
return {
host: config.get('CH_HOST'),
database: config.get('CH_DB'),
password: config.get('CH_PWD'),
username: config.get('CH_USERNAME'),
};
},
inject: [ConfigService],
}),
],
controllers: [],
providers: [],
})
export class AppModule {}
那你可以用这个 CLICKHOUSE_ASYNC_INSTANCE_TOKEN 输入 ClickHouseClient 与您刚刚提供的同步配置.
import {
ClickHouseClient,
CLICKHOUSE_ASYNC_INSTANCE_TOKEN,
} from '@depyronick/nestjs-clickhouse';
export class AppModule {
constructor(
@Inject(CLICKHOUSE_ASYNC_INSTANCE_TOKEN)
private readonly chWithAsyncConfig: ClickHouseClient,
) {
this.chWithAsyncConfig
.query('SELECT * FROM [TABLE] LIMIT 1')
.subscribe((row) => console.log('row', row));
}
}
你也可以使用这个 InjectClickHouse 帮助避免导入 Inject 直接 :
import { ClickHouseClient, InjectClickHouse } from '@depyronick/nestjs-clickhouse';
export class AppModule {
constructor(
@InjectClickHouse()
private readonly chWithAsyncConfig: ClickHouseClient,
) {}
}
如果您注册了名客户端,请将其名称传给 InjectClickHouse('ANALYTICS_SERVER')。 。 。 .
如果您想要定义多个 ClickHouseClient 使用 registerAsync 方法,您需要创建不同的模块,并注入 CLICKHOUSE_ASYNC_INSTANCE_TOKEN 输入特性模块.
不过你不用用 registerAsync 创建同步的方法 ClickHouseClient 实例。 您也可以使用自定义提供者 :
import { Inject, Module } from '@nestjs/common';
import { ClickHouseClient } from '@depyronick/nestjs-clickhouse';
import { ConfigModule, ConfigService } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
envFilePath: ['.development.env'],
isGlobal: true,
}),
],
controllers: [],
providers: [
{
provide: 'CH2',
useFactory: (config: ConfigService) => {
return new ClickHouseClient({
host: config.get('CH2_HOST'),
database: config.get('CH2_DB'),
password: config.get('CH2_PWD'),
username: config.get('CH2_USERNAME'),
});
},
inject: [ConfigService],
},
],
})
export class AppModule {
constructor(
@Inject('CH2')
private readonly clickhouse: ClickHouseClient,
) {
this.clickhouse
.query('SELECT * FROM [TABLE] LIMIT 1')
.subscribe((row) => console.log('row', row));
}
}
通过自定义提供者,您可以创建尽可能多的同步加载客户端并使用您的名称 provide(单位:千美元).
页:1
- 将积极维持和改进这一储存库.
- 计划执行 TCP 协议,如果 ClickHouse 决定 文档 这个.
- 计划执行带有流的插入.
- 这个库支持http响应压缩,如brotli,gzip和deflate等.
支助
Nest是麻省理工学院许可的开源项目. 它可以增长多亏赞助商和惊人的支持者的支持. 如果你想加入他们,请 这里读更多。 。 。 .
保持联系
- 作者 - 翻译 阿里·德米尔奇
许可证
麻省理工学院执照。 。 。 .