database/sql 或“标准”API 允许你在需要通过遵循标准接口来屏蔽底层数据库差异的场景中使用该客户端。这也会带来一定代价——会增加额外的抽象层和间接层,以及一些未必与 ClickHouse 完全契合的基本类型。不过,在工具需要连接多个数据库的场景中,这些成本通常是可以接受的。
此外,该客户端还支持使用 HTTP 作为传输层——数据仍会以原生格式编码,以获得最佳性能。
连接
clickhouse://<host>:<port>?<query_option>=<value> 的 DSN 字符串结合 Open 方法建立连接,也可以使用 clickhouse.OpenDB 方法。后者虽然不属于 database/sql 规范的一部分,但会返回一个 sql.DB 实例。该方法还提供了 profiling 等功能,而这些功能显然无法通过 database/sql 规范对外暴露。
conn 变量。
连接设置
hosts- 用于负载均衡和故障转移的单地址主机列表,以逗号分隔。请参见连接到多个节点。username/password- 身份验证凭据。请参见身份验证database- 选择当前默认数据库dial_timeout- 耗时字符串可以是一个可带符号的十进制数字序列,每个数字都可以带可选的小数部分和单位后缀,例如300ms、1s。有效的时间单位包括ms、s、m。connection_open_strategy-random/in_order(默认值为random) - 请参见连接到多个节点round_robin- 从集合中按轮询方式选择服务器in_order- 按指定顺序选择第一个可用服务器
debug- 启用调试输出 (布尔值)compress- 指定压缩算法 -none(默认) 、zstd、lz4、gzip、deflate、br。如果设置为true,将使用lz4。原生通信仅支持lz4和zstd。compress_level- 压缩级别 (默认值为0) 。请参见压缩。该参数因算法而异:gzip--2(最快速度) 到9(最高压缩率)deflate--2(最快速度) 到9(最高压缩率)br-0(最快速度) 到11(最高压缩率)zstd,lz4- 忽略
secure- 建立安全的 SSL 连接 (默认值为false)skip_verify- 跳过证书验证 (默认值为false)block_buffer_size- 用于控制块缓冲区大小。请参见BlockBufferSize。 (默认值为2)
通过 HTTP 连接
会话
仅限 HTTP只有在使用 HTTP 传输时才需要会话。原生 TCP 连接会自动提供内置会话。
session_id,以启用与会话绑定的功能,例如临时表。
执行
sql 语句。
ExecContext——请参见使用上下文。
批次插入
Being 方法创建一个 sql.Tx,以实现批次语义。基于此,可使用带有 INSERT 语句的 Prepare 方法获取一个批次。这会返回一个 sql.Stmt,可通过 Exec 方法向其中追加行。在原始 sql.Tx 上执行 Commit 之前,该批次会一直累积在内存中。
查询行
QueryRow 方法查询单行数据。它会返回一个 *sql.Row,可在其上调用 Scan,并传入变量指针,以便将各列的数据写入这些变量中。QueryRowContext 变体允许传入除 background 之外的上下文 - 请参见 使用 Context。
Query 方法。该方法会返回一个 *sql.Rows 结构体,可在其上调用 Next 来逐行遍历。与之对应的 QueryContext 则允许传入上下文。
异步插入
ExecContext 方法执行插入来实现异步插入。如下面所示,需要向其传入启用了异步模式的上下文。这样,用户便可指定客户端是等待服务器完成插入,还是在接收到数据后就立即返回响应。这实际上控制的是参数 wait_for_async_insert。
参数绑定
Exec、Query 和 QueryRow 方法 (以及它们对应的 上下文 变体) 。支持位置参数、命名参数和编号参数。
使用上下文
Context 变体来实现的。也就是说,像 Exec 这类默认使用 background 上下文的方法,都有一个对应的变体 ExecContext,可将上下文作为第一个参数传入。这样一来,你就可以在应用流程的任何阶段传递上下文。例如,可以在通过 ConnContext 建立连接时传递上下文,或者在通过 QueryRowContext 请求查询行时传递上下文。下面给出了所有可用方法的示例。
有关如何使用上下文传递截止时间、取消信号、查询 id、配额键和连接设置的更多信息,请参阅 ClickHouse API 的 使用上下文。
动态扫描
外部表
SELECT 查询时一并向 ClickHouse 传送数据。这些数据会被放入临时表中,并可在查询中用于求值。
要在发起查询时向 ClickHouse 发送外部数据,用户必须先通过 ext.NewTable 构建一个外部表,然后再通过上下文将其传入。
OpenTelemetry
clickhouse.WithSpan 可通过上下文将 span 附加到查询上。
HTTP 传输限制虽然 ClickHouse server 接受标准的
traceparent / tracestate HTTP 请求头,但 clickhouse-go 的 HTTP 传输目前不会发送这些请求头,因此 WithSpan 在 HTTP 下不起作用。临时的解决办法是通过连接选项中的 HttpHeaders 手动设置请求头。压缩
lz4 和 zstd 压缩。此外,HTTP 连接还支持 gzip、deflate 和 br 压缩。如果启用了其中任意一种,插入时以及查询响应中的块都会被压缩。其他请求 (例如 ping 或查询请求) 则保持未压缩状态。这与 lz4 和 zstd 选项的行为一致。
如果使用 OpenDB 方法建立连接,可以传入 Compression 配置。其中还可以指定压缩级别 (见下文) 。如果通过带 DSN 的 sql.Open 进行连接,请使用参数 compress。该参数既可以指定具体的压缩算法,即 gzip、deflate、br、zstd 或 lz4,也可以是布尔值。如果将其设为 true,则会使用 lz4。默认值为 none,即禁用压缩。
gzip--2(最快速度) 到9(最佳压缩)deflate--2(最快速度) 到9(最佳压缩)br-0(最快速度) 到11(最佳压缩)zstd,lz4- 会被忽略