@depyronick/nestjs-clickhouse

中文文档
2.1.0发布于 2026/01/21MITTypeScriptCommonJS近 30 天下载 3526

点击 NestJS 的住房客户端模块

中文使用文档
文档目录12 节
  1. 说明
  2. 安装
  3. 快速启动
  4. 导入模块
  5. 与 ClickHouse 客户端交互
  6. 实例
  7. 多个客户端
  8. Async 注册和Async 供应商
  9. 页:1
  10. 支助
  11. 保持联系
  12. 许可证

说明

点击之家 是使用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是麻省理工学院许可的开源项目. 它可以增长多亏赞助商和惊人的支持者的支持. 如果你想加入他们,请 这里读更多。 。 。 .

保持联系

许可证

麻省理工学院执照。 。 。 .

版本与发布记录

@depyronick/nestjs-clickhouse 共发布 17 个版本,首次发布于 2021/11/12;过去 12 个月发布了 1 个版本。

版本发布日期距今
2.1.0latest2026/01/219 个月前
2.0.52024/10/172 年前
2.0.42024/01/292 年前
2.0.22023/04/193 年前
2.0.12023/02/203 年前
2.0.02022/11/243 年前

关于 @depyronick/nestjs-clickhouse 的常见问题

@depyronick/nestjs-clickhouse 是什么?

点击 NestJS 的住房客户端模块

如何安装 @depyronick/nestjs-clickhouse?

在项目目录运行 npm install @depyronick/nestjs-clickhouse,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@nestjs/common(^10.0.0 || ^11.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@depyronick/nestjs-clickhouse 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@depyronick/nestjs-clickhouse 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@depyronick/nestjs-clickhouse 可以商用吗?

@depyronick/nestjs-clickhouse 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@depyronick/nestjs-clickhouse 的下载量有多少?

根据 npm 官方下载统计,@depyronick/nestjs-clickhouse 在 2026/10/12 – 2026/11/10 这 30 天内被下载 3,526 次,日均约 118 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@depyronick/nestjs-clickhouse 还在维护吗?

最新版本 2.1.0 发布于 2026/01/21(9 个月前);至今共发布 17 个版本,其中过去 12 个月发布了 1 个;首次发布于 2021/11/12。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。