You need to enable JavaScript to run this app.
导航
ClickHouse NodeJS
最近更新时间:2025.11.11 14:01:29首次发布时间:2025.08.20 20:08:21
复制全文
我的收藏
有用
有用
无用
无用

ByteHouse 云数仓版支持通过 ClickHouse 原生 NodeJS 客户端连接。本文介绍了如何使用 ClickHouse 连接 ByteHouse 云数仓版并执行建表、查询等操作。

推荐版本

请确保您使用的 ClickHouse NodeJS 客户端版本为 v2.4.2 及以上版本。

使用限制
  • 暂时不支持 ByteHouse 的 JSONB、BitMap64 类型。
  • 如果您在使用过程中遇到其他未知限制,请联系 ByteHouse 团队处理。

安装 ClickHouse NodeJS 客户端

使用 npm 安装 ClickHouse NodeJS 客户端。

npm install clickhouse@2.4.2

获取 ByteHouse 连接信息

ByteHouse 支持通过 IAM 用户或数据库用户连接 ClickHouse NodeJS。IAM 用户与数据库用户二者差异说明如下,您可按需选择。

  • IAM 用户为火山引擎访问控制(IAM)中创建的用户,其权限由 IAM 权限策略及您授予的 ByteHouse 资源和数据权限决定。IAM 用户可访问 ByteHouse 控制台,也支持通过 CLI、连接驱动、生态工具、API 等方式访问 ByteHouse。
  • 数据库用户为 ByteHouse 中创建的数据库级别用户,可为其授予环境、资源和数据权限。数据库用户不可访问 ByteHouse 控制台,但支持通过 CLI、连接驱动、生态工具、API 等方式访问 ByteHouse。

更多 IAM 用户和数据库用户的介绍请参见以下文档:

使用 IAM 用户连接

请参考步骤三:获取 ByteHouse 连接串信息,了解如何通过 IAM 用户方式连接到 ByteHouse。
通用参数说明如下:

参数

配置说明

host

配置为 ByteHouse 的公网/私网域名,您可以在 ByteHouse 控制台的租户管理 > 基本信息 > 网络信息中查看并复制域名信息,详情请参见步骤二:配置网络信息

port

固定为 8123。

User & Password

登录 ByteHouse 数据库的用户名和密码。

  • user:固定为 bytehouse
  • password:为 API Key,配置为 ByteHouse 的租户管理 > 连接信息中获取的API Key,详情请参见获取 API Key

VIRTUAL_WAREHOUSE_ID

可选配置,配置为计算组名。如果您需要指定计算组进行查询和写入,可配置该参数。
您可登录 ByteHouse 控制台,单击顶部计算组,查看并复制计算组 ID。示例:vw-{environment_id}{account_id}-{virtual_warehouse_name}
如果不配置,则默认使用您在 ByteHouse 设置的默认计算组。

Database

ByteHouse 数据库名称。您可登录 ByteHouse 控制台,在数据库页面查看并复制数据库。

使用数据库用户连接

参数

配置说明

host

配置为 ByteHouse 的公网/私网域名,您可以在 ByteHouse 控制台的租户管理 > 基本信息 > 网络信息中查看并复制域名信息,详情请参见步骤二:配置网络信息

port

固定为 8123。

User & Password

登录 ByteHouse 数据库的用户名和密码。

  • User 配置为 {accountID_or_accountName}::{username}[::{envID}],详情请参见步骤三:获取 ByteHouse 连接串信息
    • {accountID_or_accountName} :指火山引擎用户账号 ID 或名称,可登录 ByteHouse 控制台,单击右上角个人中心查看并复制账号 ID 或名称。
    • {username} :指登录 ByteHouse 数据库的用户名。可在 ByteHouse 控制台 > 权限管理 > 用户 > 查看数据库用户名
    • {envID}:可选配置,数据库所在的环境名称。如果使用 default 环境,可不配置;如需使用其他环境,需指定环境名称,配置时无需添加[]。您可登录 ByteHouse 控制台,在租户管理 > 基本信息 > 当前环境中获取。
      使用示例如下:
      • 配置环境 ID:21xxxxxxxx::demouser::demoenv
      • 不配置环境 ID:21xxxxxxxx::demouser
  • Password:可联系管理员获取数据库账号的密码。如果密码丢失或遗忘,可通联系管理员重置密码,详情请参考重置密码

VIRTUAL_WAREHOUSE_ID

可选配置,配置为计算组名。如果您需要指定计算组进行查询和写入,可配置该参数。
您可登录 ByteHouse 控制台,单击顶部计算组,查看并复制计算组 ID。示例:vw-{environment_id}{account_id}-{virtual_warehouse_name}
如果不配置,则默认使用您在 ByteHouse 设置的默认计算组。

Database

ByteHouse 数据库名称。您可登录 ByteHouse控制台,在数据库页面查看并复制数据库。

基本用法

连接 ByteHouse

可参考下面代码连接至 ByteHouse,使用时注意替换连接语句中的 {host} {password}{user}{Database}{VIRTUAL_WAREHOUSE_ID} 等连接信息字段,获取方式请参见获取 ByteHouse 连接信息

const host = '{Host}';
const port = 8123;
const password = '{Password}';
const user = '{User}';
const database = '{Database}';
const virtual_warehouse = '{VIRTUAL_WAREHOUSE_ID}';

const clickhouse = new ClickHouse({
    url: util.format('https://%s', host),
    port: port,
    debug: false,

    basicAuth: {
        username: user,
        password: password,
    },

    isUseGzip: false,
    usePost: false,
    format: 'json',

    config: {
        session_timeout: 60,
        output_format_json_quote_64bit_integers: 0,
        enable_http_compression: 0,
        database: database,
        virtual_warehouse: virtual_warehouse,
    },

});

参数说明如下:

参数

配置说明

debug

是否开启 debug 模式,默认值为 false。

basicAuth.username

用户名,固定为 bytehouse。

basicAuth.password

连接密码,设置为 ByteHouse 云数仓版的 API Key。您可登录 ByteHouse 云数仓版控制台,在租户管理页签下,单击连接信息,新建并复制 API Key。

isUseGzip

设置是否启用 Gzip 压缩传输数据。如需启用,可设置为 true。默认值为 false。

usePost

设置是否使用 POST 方法发送查询请求。POST 请求适用于查询内容过大的场景,如需启用此功能,将该值设置为 true。默认值为 false

format

指定查询结果或插入数据的格式,支持 JSON、CSV、TSV 格式。当前不支持 JSONEachRow 格式,请勿设置为该格式。

config.session_timeout

设置会话超时时间,默认值为 60 秒。

config.output_format_json_quote_64bit_integers

控制 JSON 格式输出时 64 位整数是否被引号包裹,默认值为 0。设置为 0 时表示直接以数字形式返回,设置为 1 时表示以字符串形式返回(例如"12345678")。

config.enable_http_compression

设置是否启用 HTTP 传输压缩,设置为 0 表示不启用,设置为 1 表示启用。

config.database

设置为您需要连接的 ByteHouse 云数仓版数据库名称。

config.virtual_warehouse

可选,指定 ByteHouse 云数仓版计算组。您可登录 ByteHouse CDW 控制台,在计算组页签下,查看并复制计算组 ID。

数据库基础操作

连接成功后,您可使用以下代码创建数据库、表、插入数据并查询数据。

import { ClickHouse } from 'clickhouse';
import * as util from "node:util";

const host = '{Host}';
const port = 8123;
const password = '{Password}';
const user = '{User}';
const database = '{Database}';
const virtual_warehouse = '{VIRTUAL_WAREHOUSE_ID}';

const clickhouse = new ClickHouse({
    url: util.format('https://%s', host),
    port: port,
    debug: false,

    basicAuth: {
        username: user,
        password: password,
    },

    isUseGzip: false,
    usePost: false,
    format: 'json',

    config: {
        session_timeout: 60,
        output_format_json_quote_64bit_integers: 0,
        enable_http_compression: 0,
        database: database,
        virtual_warehouse: virtual_warehouse,
    },

});

// @ts-ignore
// 完整案例
async function run() {
    try {
        await clickhouse.query('DROP DATABASE IF EXISTS bhnodetest').toPromise();
        await clickhouse.query('CREATE DATABASE IF NOT EXISTS bhnodetest').toPromise();
        await clickhouse.query(`
      CREATE TABLE bhnodetest.sample_table (
        id Int32,
        name String
      ) ENGINE = CnchMergeTree()
      ORDER BY id
    `).toPromise();

        await clickhouse.insert(
            'INSERT INTO bhnodetest.sample_table (id, name)',
            [
                [1, 'Alice'],
                [2, 'Bob'],
            ]
        ).toPromise();

        const rows = await clickhouse.query('SELECT * FROM bhnodetest.sample_table FORMAT JSON').toPromise();

        console.log('Query result:', rows);
    } catch (err) {
        console.error('Error running ClickHouse operations:', err);
    }
}

// @ts-ignore
await run();

使用回调函数查询

该示例演示了通过回调函数处理查询结果的异步执行方式。

clickhouse.query('SELECT * FROM bhnodetest.sample_table FORMAT JSON').exec((err, rows) => {
    if (err) {
        console.error('Callback query error:', err);
    } else {
        console.log('Query result (Callback):', rows);
    }
});

流式查询

该示例演示了通过流(Stream)方式处理查询结果,适用于返回数据量较大的场景,如批量读取数据,可逐行处理数据而非等待全部加载完成。

clickhouse.query('SELECT number FROM system.numbers LIMIT 5 FORMAT JSON').stream()
  .on('data', function (chunk) {
    const stream = this;
    process.stdout.write('Stream chunk: ' + chunk.toString());
    stream.pause();
    setTimeout(() => stream.resume(), 1000); // 模拟背压场景
  })
  .on('error', err => {
    console.error('Stream error:', err);
  })
  .on('end', () => {
    console.log('\nStream ended.');
  });

流式插入

该示例演示了通过流(Stream)方式处理查询结果,适用于返回数据量较大的场景,如批量读取数据,可逐行处理数据而非等待全部加载完成。

clickhouse.query('SELECT number FROM system.numbers LIMIT 5 FORMAT JSON').stream()
    .on('data', function (chunk) {
        const stream = this;
        process.stdout.write('Stream chunk: ' + chunk.toString());
        stream.pause();
        setTimeout(() => stream.resume(), 1000); // 模拟背压场景
    })
    .on('error', err => {
        console.error('Stream error:', err);
    })
    .on('end', () => {
        console.log('\nStream ended.');
    });