由于可用参数较多,且其中大多数为可选参数,因此建议大多数 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 设置进行连接。
客户端生命周期和最佳实践
核心原则
- 复用客户端:在应用启动时创建一次客户端,并在整个应用生命周期内重复使用
- 避免频繁创建:不要为每个查询或请求都新建客户端 (这会让每次操作额外耗费数百毫秒)
- 正确清理:应用关闭时务必关闭客户端,以释放连接池资源
- 尽可能共享:单个客户端可通过其连接池处理大量并发查询 (参见下方的线程说明)
基本原则
多线程应用
正确清理
client.close() 才会释放客户端并关闭池化的 HTTP 连接。对于默认的共享连接池,请使用 client.close_connections() 主动清理套接字;否则,连接会在空闲超时后以及进程退出时自动回收。
何时使用多个客户端
- 不同的服务器:每个 ClickHouse 服务器或集群使用一个客户端
- 不同的凭据:针对不同用户或不同访问级别分别使用独立客户端
- 不同的数据库:当你需要使用多个数据库时
- 隔离的会话:当你需要为临时表或会话级设置使用独立会话时
- 按线程隔离:当线程需要独立会话时 (如上所示)
常用方法参数
parameters 和/或 settings 参数。下面将介绍这些关键字参数。
Parameters 参数
query* 和 command 方法都接受一个可选的 parameters 关键字参数,用于将 Python 表达式绑定到 ClickHouse 值表达式。提供两种绑定方式。
服务器端绑定
{<name>:<datatype>} 的绑定表达式,就会添加相应的查询参数。对于服务器端绑定,parameters 参数应为 Python 字典。
- 使用 Python 字典、DateTime 值和字符串值进行服务器端绑定
客户端绑定
parameters 参数应为字典或序列。客户端绑定使用 Python 的”printf” 风格字符串格式化进行参数替换。
请注意,与服务器端绑定不同,客户端绑定不适用于数据库标识符,例如 database、表或列名,因为 Python 风格的格式化无法区分不同类型的字符串,而这些字符串需要采用不同的格式化方式 (数据库标识符使用反引号或双引号,数据值使用单引号) 。
- 使用 Python Dictionary、DateTime 值和字符串转义的示例
- Python Sequence (Tuple) 、Float64 和 IPv4Address 示例
要绑定 DateTime64 参数 (即具有子秒级精度的 ClickHouse 类型) ,需要使用以下两种自定义方法之一:
- 将 Python
datetime.datetime值封装到新的 DT64Param 类中,例如:- 如果使用参数值字典,请在参数名后附加字符串
_64
- 如果使用参数值字典,请在参数名后附加字符串
Settings 参数
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-SummaryHTTP 响应请求头中返回的任何数据first_item— 一个便捷属性,用于以字典形式获取响应中的第一行 (键为列名)first_row— 一个便捷属性,用于返回结果中的第一行column_block_stream— 以列导向格式返回查询结果的生成器。不应直接引用此属性 (见下文) 。row_block_stream— 以行导向格式返回查询结果的生成器。不应直接引用此属性 (见下文) 。rows_stream— 一个每次调用产出单行的查询结果生成器。不应直接引用此属性 (见下文) 。summary— 如command方法部分所述,这是一个包含 ClickHouse 返回的摘要信息的字典
*_stream 属性会返回一个 Python Context,可用作返回数据的迭代器。只能通过 Client 的 *_stream 方法间接访问它们。
有关流式查询结果 (使用 StreamContext 对象) 的完整说明,请参阅高级查询 (流式查询) 。
使用 NumPy、Pandas 或 Arrow 处理查询结果
客户端流式查询方法
客户端 insert 方法
Client.insert 方法。它接受以下参数:
此方法会返回一个“查询摘要”字典,具体说明见“command”方法部分。如果插入因任何原因失败,则会引发异常。
如需使用适用于 Pandas DataFrames、PyArrow Tables 和 Arrow-backed DataFrames 的专用插入方法,请参见 高级插入 (专用插入方法) 。
NumPy 数组属于合法的 Sequence of Sequences,因此可直接作为主
insert 方法的 data 参数使用,无需专用方法。示例
users 表,其 schema 为 (id UInt32, name String, age UInt8)。
简单的按行插入
按列插入
使用显式指定的列类型进行插入
向特定数据库插入
文件插入
原始 API
实用类和函数
clickhouse-connect API 的一部分,并且与上文介绍的类和方法一样,在各个次要版本之间保持稳定。对这些类和函数的破坏性变更只会出现在次要版本发布中 (而非补丁版本) ,并且至少会在一个次要版本内以弃用状态提供。
异常
clickhouse_connect.driver.exceptions 模块中。驱动程序实际检测到的异常会使用其中一种类型。
ClickHouse SQL 实用工具
clickhouse_connect.driver.binding 模块中的函数和 DT64Param 类可用于正确构造并转义 ClickHouse SQL 查询。类似地,clickhouse_connect.driver.parser 模块中的函数可用于解析 ClickHouse 数据类型名称。