You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python操作ClickHouse遇HttpClient无execute属性错误求助

问题解决:'HttpClient' object has no attribute 'execute'

核心原因

你混用了两个不同的ClickHouse Python客户端库:

  • clickhouse_driver:基于TCP协议的客户端,提供execute方法
  • clickhouse_connect:基于HTTP协议的客户端,没有execute方法,对应的操作方法是query/insert

同时代码还存在其他问题:未定义get_random_string函数、数据格式错误、端口配置不匹配,以及堆栈信息显示的认证失败问题。


修复方案

方案1:使用clickhouse_driver(TCP客户端)

修正后的代码

from clickhouse_driver import Client
import random
import datetime

# 实现缺失的随机字符串生成函数
def get_random_string(length):
    chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
    return ''.join(random.choice(chars) for _ in range(length))

CLICKHOUSE_HOST = 'localhost'
CLICKHOUSE_USER = 'username'
CLICKHOUSE_PASSWORD = 'password'
# TCP客户端默认用9000端口,8123是HTTP端口
client = Client(
    host=CLICKHOUSE_HOST, port=9000, 
    user=CLICKHOUSE_USER, password=CLICKHOUSE_PASSWORD
)

current_time = datetime.datetime.now()
data = []
for x in range(1000):
    # JSONEachRow需要字典格式,必须指定表的字段名作为键
    data.append({
        'id': x,
        'col1': get_random_string(random.randint(5, x+6)),
        'col2': get_random_string(random.randint(5, x+6)),
        'col3': get_random_string(random.randint(5, x+6)),
        'create_time': current_time
    })

# 使用execute执行插入,FORMAT匹配数据格式
client.execute("INSERT INTO test FORMAT JSONEachRow", data)

关键修正点

  • 移除clickhouse_connect调用,改用clickhouse_driver的Client初始化客户端
  • 补全缺失的get_random_string函数
  • 将集合{x, ...}改为字典格式,符合JSONEachRow的要求
  • 端口改为TCP默认的9000(8123是HTTP端口,TCP客户端不适用)
  • 核对用户名/密码正确性,解决堆栈中的认证失败问题

方案2:使用clickhouse_connect(HTTP客户端)

如果坚持用clickhouse_connect,需要改用它的insert方法:

修正后的代码

import clickhouse_connect
import random
import datetime

def get_random_string(length):
    chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
    return ''.join(random.choice(chars) for _ in range(length))

CLICKHOUSE_HOST = 'localhost'
CLICKHOUSE_USER = 'username'
CLICKHOUSE_PASSWORD = 'password'
client = clickhouse_connect.get_client(
    host=CLICKHOUSE_HOST, port=8123, 
    username=CLICKHOUSE_USER, password=CLICKHOUSE_PASSWORD
)

current_time = datetime.datetime.now()
# 按表字段顺序整理成二维列表格式
data = []
for x in range(1000):
    data.append([
        x,
        get_random_string(random.randint(5, x+6)),
        get_random_string(random.randint(5, x+6)),
        get_random_string(random.randint(5, x+6)),
        current_time
    ])

# 使用insert方法,指定表名和字段列表
client.insert(
    table='test',
    data=data,
    column_names=['id', 'col1', 'col2', 'col3', 'create_time']
)

关键修正点

  • 使用clickhouse_connect的insert方法替代不存在的execute方法
  • 数据格式改为二维列表,无需手动指定FORMAT,库会自动处理
  • 保持HTTP端口8123不变
  • 补全get_random_string函数,核对用户名密码正确性

附加说明

堆栈信息中的AccessControl::authenticate错误,说明ClickHouse服务拒绝了认证请求,请确认:

  • 用户名和密码与ClickHouse配置完全一致
  • 如果是ClickHouse Cloud,需使用正确的主机名、端口和专属密钥(不是普通密码)
  • 本地部署的ClickHouse需确保用户权限配置正确

内容的提问来源于stack exchange,提问作者ali heydarabadii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:32:21