Skip to main content
由于可用参数较多,且其中大多数为可选参数,因此建议大多数 API 方法使用关键字参数。此处未文档说明的方法不属于 API 的一部分,后续可能会被移除或更改。

客户端初始化

clickhouse_connect.driver.client 类是 Python 应用程序与 ClickHouse 数据库 server 之间的主要接口。使用 clickhouse_connect.get_client 函数获取 Client 实例,该函数接受以下参数:

连接参数

HTTPS/TLS 参数

Settings 参数

最后,get_client 的 settings 参数用于在每次客户端请求时,向服务器传递额外的 ClickHouse 设置。请注意,在大多数情况下,具有 readonly=1 权限的用户无法修改随查询一起发送的设置,因此 ClickHouse Connect 会在最终请求中丢弃此类设置,并记录一条警告。以下设置仅适用于 ClickHouse Connect 使用的 HTTP 查询/会话,不属于通用 ClickHouse 设置文档中的内容。 有关可随每个查询一起发送的其他 ClickHouse 设置,请参阅 ClickHouse 文档。

客户端创建示例

  • 在不传入任何参数的情况下,ClickHouse Connect 客户端会使用 default 用户且不设置密码,连接到 localhost 的默认 HTTP 端口:
  • 连接到安全 (HTTPS) 的外部 ClickHouse 服务器
  • 使用会话 ID、其他自定义连接参数以及 ClickHouse 设置进行连接。

客户端生命周期和最佳实践

创建 ClickHouse Connect 客户端的开销较大,因为这需要建立连接、获取服务器元数据并初始化设置。请遵循以下最佳实践以获得最佳性能:

核心原则

  • 复用客户端:在应用启动时创建一次客户端,并在整个应用生命周期内重复使用
  • 避免频繁创建:不要为每个查询或请求都新建客户端 (这会让每次操作额外耗费数百毫秒)
  • 正确清理:应用关闭时务必关闭客户端,以释放连接池资源
  • 尽可能共享:单个客户端可通过其连接池处理大量并发查询 (参见下方的线程说明)

基本原则

✅ 推荐:复用同一个客户端
❌ 不推荐:反复创建客户端

多线程应用

使用会话 ID 时,客户端实例不具备线程安全性。默认情况下,客户端会自动生成一个会话 ID;在同一会话中并发执行查询会引发 ProgrammingError。
要在线程间安全地共享客户端:
session 的替代方案: 如果你需要使用 session (例如用于临时表) ,请为每个线程单独创建一个客户端:

正确清理

务必在关闭时关闭客户端。请注意,只有当客户端拥有自己的连接池管理器时 (例如,使用自定义 TLS/代理选项创建时) ,client.close() 才会释放客户端并关闭池化的 HTTP 连接。对于默认的共享连接池,请使用 client.close_connections() 主动清理套接字;否则,连接会在空闲超时后以及进程退出时自动回收。
或者使用上下文管理器:

何时使用多个客户端

多个客户端适用于以下情况:
  • 不同的服务器:每个 ClickHouse 服务器或集群使用一个客户端
  • 不同的凭据:针对不同用户或不同访问级别分别使用独立客户端
  • 不同的数据库:当你需要使用多个数据库时
  • 隔离的会话:当你需要为临时表或会话级设置使用独立会话时
  • 按线程隔离:当线程需要独立会话时 (如上所示)

常用方法参数

多个客户端方法会使用通用的 parameters 和/或 settings 参数。下面将介绍这些关键字参数。

Parameters 参数

ClickHouse Connect 客户端的 query* 和 command 方法都接受一个可选的 parameters 关键字参数,用于将 Python 表达式绑定到 ClickHouse 值表达式。提供两种绑定方式。

服务器端绑定

ClickHouse 支持对大多数查询值使用服务器端绑定,即将绑定的值作为 HTTP 查询参数与查询语句分开发送。如果 ClickHouse Connect 检测到形如 {<name>:<datatype>} 的绑定表达式,就会添加相应的查询参数。对于服务器端绑定,parameters 参数应为 Python 字典。
  • 使用 Python 字典、DateTime 值和字符串值进行服务器端绑定
这会在服务端生成以下查询:
服务器端绑定目前仅支持 SELECT 查询 (由 ClickHouse 服务器支持) 。它不适用于 ALTER、DELETE、INSERT 或其他类型的查询。未来可能会有所变化;请参见 https://github.com/ClickHouse/ClickHouse/issues/42092。

客户端绑定

ClickHouse Connect 也支持客户端参数绑定,这样在生成模板化 SQL 查询时会更灵活。对于客户端绑定,parameters 参数应为字典或序列。客户端绑定使用 Python 的”printf” 风格字符串格式化进行参数替换。 请注意,与服务器端绑定不同,客户端绑定不适用于数据库标识符,例如 database、表或列名,因为 Python 风格的格式化无法区分不同类型的字符串,而这些字符串需要采用不同的格式化方式 (数据库标识符使用反引号或双引号,数据值使用单引号) 。
  • 使用 Python Dictionary、DateTime 值和字符串转义的示例
这会在服务器端生成以下查询:
  • Python Sequence (Tuple) 、Float64 和 IPv4Address 示例
这将在服务器端生成以下查询:
要绑定 DateTime64 参数 (即具有子秒级精度的 ClickHouse 类型) ,需要使用以下两种自定义方法之一:
  • 将 Python datetime.datetime 值封装到新的 DT64Param 类中,例如:
    • 如果使用参数值字典,请在参数名后附加字符串 _64

Settings 参数

所有关键的 ClickHouse Connect 客户端 insert 和 select 方法都接受一个可选的 settings 关键字参数,用于为包含的 SQL 语句传递 ClickHouse 服务器的用户设置。settings 参数应为一个字典。每一项都应包含一个 ClickHouse 设置名称及其对应的值。请注意,这些值在作为查询参数发送到服务器时会被转换为字符串。 与客户端级别的设置一样,ClickHouse Connect 会丢弃任何被服务器标记为 readonly=1 的设置,并记录相应的日志消息。仅适用于通过 ClickHouse HTTP interface 发起查询的设置始终有效。这些设置在 get_client API 下有说明。 使用 ClickHouse 设置的示例:

Client command 方法

使用 Client.command 方法向 ClickHouse 服务器发送 SQL 查询,这类查询通常不返回数据,或者返回单个基本类型值或数组值,而不是完整的数据集。此方法接受以下参数:

命令示例

DDL 语句

返回单个值的简单查询

带参数的命令

带设置的命令

客户端 query 方法

Client.query 方法是从 ClickHouse 服务器 检索单个“批次”数据集的主要方式。它通过 HTTP 使用 ClickHouse Native 格式高效传输大型数据集 (最多约一百万行) 。此方法接受以下参数:

查询示例

基本查询

查看查询结果

使用客户端参数的查询

使用服务端参数的查询

带设置的查询

QueryResult 对象

基础 query 方法会返回一个 QueryResult 对象,包含以下公共属性:
  • result_rows — 以行 Sequence 形式返回的数据矩阵,其中每个行元素都是由列值组成的序列。
  • result_columns — 以列 Sequence 形式返回的数据矩阵,其中每个列元素都是由该列各行的值组成的序列
  • column_names — 一个字符串元组,表示 result_set 中的列名
  • column_types — 一个 ClickHouseType 实例元组,表示 result_columns 中每一列的 ClickHouse 数据类型
  • query_id — ClickHouse 的 query_id (可用于在 system.query_log 表中查看该查询)
  • summary — X-ClickHouse-Summary HTTP 响应请求头中返回的任何数据
  • first_item — 一个便捷属性,用于以字典形式获取响应中的第一行 (键为列名)
  • first_row — 一个便捷属性,用于返回结果中的第一行
  • column_block_stream — 以列导向格式返回查询结果的生成器。不应直接引用此属性 (见下文) 。
  • row_block_stream — 以行导向格式返回查询结果的生成器。不应直接引用此属性 (见下文) 。
  • rows_stream — 一个每次调用产出单行的查询结果生成器。不应直接引用此属性 (见下文) 。
  • summary — 如 command 方法部分所述,这是一个包含 ClickHouse 返回的摘要信息的字典
*_stream 属性会返回一个 Python Context,可用作返回数据的迭代器。只能通过 Client 的 *_stream 方法间接访问它们。 有关流式查询结果 (使用 StreamContext 对象) 的完整说明,请参阅高级查询 (流式查询) 。

使用 NumPy、Pandas 或 Arrow 处理查询结果

ClickHouse Connect 提供了针对 NumPy、Pandas 和 Arrow 数据格式的专用查询方法。有关这些方法的详细用法,包括示例、流式功能以及高级类型处理,请参阅 高级查询 (NumPy、Pandas 和 Arrow 查询) 。

客户端流式查询方法

对于大型结果集的流式处理,ClickHouse Connect 提供了多种流式查询方法。有关详细信息和示例,请参阅 高级查询 (流式查询) 。

客户端 insert 方法

对于向 ClickHouse 插入多条记录这一常见场景,可以使用 Client.insert 方法。它接受以下参数: 此方法会返回一个“查询摘要”字典,具体说明见“command”方法部分。如果插入因任何原因失败,则会引发异常。 如需使用适用于 Pandas DataFrames、PyArrow Tables 和 Arrow-backed DataFrames 的专用插入方法,请参见 高级插入 (专用插入方法) 。
NumPy 数组属于合法的 Sequence of Sequences,因此可直接作为主 insert 方法的 data 参数使用,无需专用方法。

示例

以下示例假设已存在一张 users 表,其 schema 为 (id UInt32, name String, age UInt8)。

简单的按行插入

按列插入

使用显式指定的列类型进行插入

向特定数据库插入

文件插入

如需将数据直接从文件插入 ClickHouse 表,请参阅 高级插入 (文件插入) 。

原始 API

对于需要直接访问 ClickHouse HTTP 接口且不进行类型转换的高级用例,请参阅高级用法 (原始 API) 。

实用类和函数

以下类和函数也被视为“公开”的 clickhouse-connect API 的一部分,并且与上文介绍的类和方法一样,在各个次要版本之间保持稳定。对这些类和函数的破坏性变更只会出现在次要版本发布中 (而非补丁版本) ,并且至少会在一个次要版本内以弃用状态提供。

异常

所有自定义异常 (包括 DB API 2.0 规范中定义的异常) 均定义在 clickhouse_connect.driver.exceptions 模块中。驱动程序实际检测到的异常会使用其中一种类型。

ClickHouse SQL 实用工具

clickhouse_connect.driver.binding 模块中的函数和 DT64Param 类可用于正确构造并转义 ClickHouse SQL 查询。类似地,clickhouse_connect.driver.parser 模块中的函数可用于解析 ClickHouse 数据类型名称。

多线程、多进程和异步/事件驱动使用场景

有关在多线程、多进程和异步/事件驱动应用中使用 ClickHouse Connect 的信息,请参阅高级用法 (多线程、多进程和异步/事件驱动使用场景) 。

AsyncClient 包装器

有关如何在 asyncio 环境中使用 AsyncClient 包装器,请参阅 高级用法 (AsyncClient 包装器) 。

管理 ClickHouse 会话 ID

有关如何在多线程或并发应用中管理 ClickHouse 会话 ID,请参阅高级用法 (管理 ClickHouse 会话 ID) 。

自定义 HTTP 连接池

如需了解如何为大型多线程应用程序自定义 HTTP 连接池,请参阅高级用法 (自定义 HTTP 连接池) 。
最后修改于 2026年6月10日