@apla/clickhouse

中文文档
1.6.4发布于 2020/09/13MITCommonJS零依赖近 30 天下载 2.3万

Yandex ClickHouse 数据库接口

中文使用文档
文档目录12 节
  1. 概要
  2. API 密码
  3. new ClickHouse(options: Options)
  4. clickHouse.query(query, [options], [callback])
  5. clickHouse.ping(callback)
  6. 承诺接口
  7. clickHouse.querying(query, [options])
  8. clickHouse.pinging()
  9. 如何运作
  10. 装入大量数据 INSERT 声明
  11. 内存大小
  12. 实例

简单而强大的接口 点击之家 travis codecov

npm install @apla/clickhouse

概要

const ClickHouse = require('@apla/clickhouse')
const ch = new ClickHouse({ host, port, user, password })

const stream = ch.query("SELECT 1", (err, data) => {})
stream.pipe(process.stdout)

// promise interface, not recommended for selects
// (requires 'util.promisify' for node < 8, Promise shim for node < 4)
await ch.querying("CREATE DATABASE test")

实例:

API 密码

new ClickHouse(options: Options)

Options

所需经费默认说明
host✓主机要连接 .
user认证用户 .
password认证密码 .
path (单位:千美元)pathname(中文(简体) )/ClickHouse 服务器的路径名 .
port8123服务器端口号.
protocol'http:''https:' 或者说 'http:'。 。 。 .
dataObjectsfalse默认( E)false),你会得到每行的数值阵列.
如果你准备好了 dataObjects: true,每行将变成格式为: { fieldName: fieldValue, … }。 。 。 .
免职 format: 'JSON'。 。 。 .
formatJSONCompact添加 FORMAT 如果没有用于查询的语句.
指定格式 选中 或者说 插入时 数据.
见 “输入和输出数据格式” 查找可能的值.
queryOptions对象,可以包含任何来自 设置, (中文(简体) ), 限制 财务报告和审定财务报表 权限。 。 。 .
见 实例。 。 。 .
readonlyfalse告诉驱动程序用 HTTP Get 方法发送查询 。 与 readonly=1 设置。 。 。 . 更多细节。 。 。 .
timeout, (中文(简体) ),
headers, (中文(简体) ),
agent, (中文(简体) ),
localAddress, (中文(简体) ),
servername, (中文(简体) ),
还有..
任意 http.request 请求 或者说 网页请求 也可以选择.
选项示例 :
const ch = new ClickHouse({
  host: "clickhouse.msk",
  dataObjects: true,
  readonly: true,
  queryOptions: {
    profile: "web",
    database: "test",
  },
})

clickHouse.query(query, [options], [callback])

向服务器发送查询语句.

query: string

SQL 查询语句.

options: Options

一样 Options,不包括连接选项.

callback: (error, result) => void

总是需要完成.

回返情况: DuplexStream

它支持 .pipe 用于处理记录.
您至少应该有一个错误处理器在听 。 通过查询调用或通过流 error 活动.

串流事件说明
'error'查询执行完成时出错 .
如果您有这两个查询 callback 和流 error 听着,你会得到错误通知 两个听众.
'metadata'当一列信息被解析时 .
'data'当一行可出.
'end'当处理整个响应时.
无论是否有 'end' 听者, 查询 callback 总是被调用.
你应该总是听 'data' 活动与 'end' 活动.
"除非数据被完全耗尽,否则"末"事件将不会被排放"
如果你不需要处理 'data' 事件偏好只使用 callback 或者说 承诺接口。 。 。 .
stream.supplemental

处理响应后,可以从中读取补充响应数据,如行数.

实例:

clickHouse.ping(callback)

发送空查询. 不需要授权.

callback: (error, result) => void

将呼吁完成.


承诺接口

承诺接口 不建议 页:1 INSERT 财务报告和审定财务报表 SELECT 查询.

  • INSERT 无法使用承诺接口进行批量加载数据.
  • SELECT 将收集内存中的全部查询结果。 见 内存大小 节.

带有承诺界面查询结果的解析同步. 这意味着大查询导致承诺界面:

  • 将同步屏蔽JS线/事件循环.
  • 可能导致您的应用程序内存泄漏 最高GC负载.

仅用于已知和极小数据大小的查询.
使用它的良好案例是 DESCRIBE TABLE 或者说 EXISTS TABLE

clickHouse.querying(query, [options])

类似 ch.query(query) 但在内存中收集整个响应并用完整的查询结果解析.
见 内存大小 节.

options: Options

一样 Options,不包括连接选项.

回返情况: Promise

将用整个查询结果解决 .

实例 承诺接口。 。 。 .

clickHouse.pinging()

承诺接口 .ping。 。 。 .

回返情况: Promise

如何运作

装入大量数据 INSERT 声明

INSERT 可用于散装数据加载。 有两种易于执行的格式 带有javascript:CSV和TabSeparated/TSV.

CSV 用于从文件装入, 因此您可以读取 .pipe 输入点击器 文件内容.
要激活 CSV 解析, 您应该设置 format 驱动程序选项或查询 FORMAT 声明到 CSV数字 :


var csvStream = fs.createReadStream('data.csv')
var clickhouseStream = ch.query(statement, { format: CSV })

csvStream.pipe(clickhouseStream)

TSV对于从文件上加载和从外部来源如其他数据库上批量加载是有用的. 仅 \\, (中文(简体) ), \t 财务报告和审定财务报表 \n 需要用绳子来逃出; 数字, 虚数, 布尔斯和日期对象需要一些小的处理. 您可以发送已准备好的 TSV 数据字符串 (行尾会自动被附加),缓冲(总是像现在这样通过)或有字段的矩阵.

内部,每个字段都会被转换为ClickHouse可以接受的格式. 之后逃出并加入了特定格式的分隔符. 如果您需要存储行( 在数组中)并发送预格式数据, 您可以这样做 .

点击之家也支持 约瑟纳克罗 格式 用于插入 javascript 对象,如果您有这样的记录.

const stream = ch.query(statement, { format: 'JSONEachRow' })

stream.write(object) // Do write as many times as possible
stream.end() // And don't forget to finish insert query

内存大小

您可以在这样的单调中将所有记录读入内存:


var ch = new ClickHouse({ host: host, port: port })
ch.querying("SELECT number FROM system.numbers LIMIT 10", (err, result) => {
  // result will contain all the data you need
})

在这种情况下 服务器的JSON反应会被读入记忆中, 然后解析成记忆 占用你的CPU。 默认解析器将解析服务器响应 线条并释放出事件。 速度较慢,但内存和CPU效率要高得多 用于更大的数据集.


实例

使用流选择 :

const readableStream = ch.query(
  'SELECT * FROM system.contributors FORMAT JSONEachRow',
  (err, result) => {},
)
const writableStream = fs.createWriteStream('./contributors.json')
readableStream.pipe(writableStream)

以流插入 :

const readableStream = fs.createReadStream('./x.csv')
const writableStream = ch.query('INSERT INTO table FORMAT CSV', (err, result) => {})
readableStream.pipe(writableStream)

插入单行数据 :

const ch = new ClickHouse(options)
const writableStream = ch.query(`INSERT INTO table FORMAT TSV`, (err) => {
  if (err) {
    console.error(err)
  }
  console.log('Insert complete!')
})

// data will be formatted for you
writableStream.write([1, 2.22, "erbgwerg", new Date()])

// prepare data yourself
writableStream.write("1\t2.22\terbgwerg\t2017-07-17 17:17:17")

writableStream.end()

选择大数据集 :

const ch = new ClickHouse(options)
// it is better to use stream interface to fetch select results
const stream = ch.query("SELECT * FROM system.numbers LIMIT 10000000")

stream.on('metadata', (columns) => { /* do something with column list */ })

let rows = []
stream.on('data', (row) => rows.push(row))

stream.on('error', (err) => { /* handler error */ })

stream.on('end', () => {
  console.log(
    rows.length,
    stream.supplemental.rows,
    stream.supplemental.rows_before_limit_at_least, // how many rows in result are set without windowing
  )
})

插入大数据集 :

const ch = new ClickHouse(options)
// insert from file
const tsvStream = fs.createReadStream('data.tsv')
const clickhouseStream = ch.query('INSERT INTO table FORMAT TSV')

tsvStream.pipe(clickhouseStream)

连接设置 :

const ch = new ClickHouse({
  host: 'clickhouse.msk',
  queryOptions: {
    database: "test",
    profile: "web",
    readonly: 2,
    force_index_by_date: 1,
    max_rows_to_read: 10 * 1e6,
  },
})

查询设置 :

const ch = new ClickHouse({ host: 'clickhouse.msk' })
const stream = ch.query('INSERT INTO table FORMAT TSV', {
  queryOptions: {
    database: "test",
    insert_quorum: 2,
  },
})

承诺接口 :

const ch = new ClickHouse(options)
// Check connection to server. Doesn't requires authorization.
await ch.pinging()
const { data } = await ch.querying("SELECT 1")
// [ [ 1 ] ]
const { data } = await ch.querying("DESCRIBE TABLE system.numbers", { dataObjects: true })
// [ { name: 'number', type: 'UInt64', default_type: '', default_expression: '' } ]

版本与发布记录

@apla/clickhouse 共发布 16 个版本,首次发布于 2016/07/25;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.6.4latest2020/09/136 年前
1.6.32020/05/186 年前
1.6.22020/03/296 年前
1.6.12019/10/057 年前
1.6.02019/05/097 年前
1.5.52019/02/177 年前

关于 @apla/clickhouse 的常见问题

@apla/clickhouse 是什么?

Yandex ClickHouse 数据库接口

如何安装 @apla/clickhouse?

在项目目录运行 npm install @apla/clickhouse,或使用 pnpm add / yarn add / bun add。

@apla/clickhouse 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/apla__clickhouse 是否存在。

@apla/clickhouse 支持 ESM 还是 CommonJS?

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

@apla/clickhouse 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=0.10。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@apla/clickhouse 可以商用吗?

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

@apla/clickhouse 的下载量有多少?

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

@apla/clickhouse 还在维护吗?

最新版本 1.6.4 发布于 2020/09/13(6 年前);至今共发布 16 个版本,其中过去 12 个月发布了 0 个;首次发布于 2016/07/25。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。