python 连接clickhouse数据库及简单操作

前言

最近研究了下python爬虫,想爬取一些数据存储到clickhouse里,进行分析。由于是新手,搜了好多教程,也踩了好几天的坑,记录一下,防止以后再走弯路。

连接代码

复制代码
#引入库
from clickhouse_driver import Client
# 建立连接,注意这里的参数赋值方式
client = Client(host='xx.xx.xx.xx', port=8900, user='default', password='xxxxx@xxxxx', database='default')
result = client.execute('show tables')
print(type(result), result)
for row in result:
    print(row)
    
client.disconnect()

经验总结

遇到的问题主要集中在建立连接语句上,client = Client(host='xx.xx.xx.xx', port=8900, user='default', password='xxxxx@xxxxx', database='default')

  1. 参数赋值方式。使用 host= 格式赋值

  2. 端口用错问题。clickhouse 数据库启动时会建立三个端口监听,http端口是给第三方工具连接使用的,tcp端口才是给python 代码连接使用的。要查看对应clickhouse配置的端口,参见其他文章 clickhouse安装及简单使用

  3. 端口确认问题。在配置前,先使用telnet确认 端口服务已开启,若端口配置是对的,但还不能通,要考虑下防护墙问题。

  4. 按照以上要求,都是可以连接成功的。有的教程说还是连接不成功,八成还是端口问题。

执行查询

复制代码
#引入库
from clickhouse_driver import Client
# 建立连接,注意这里的参数赋值方式
client = Client(host='xx.xx.xx.xx', port=8900, user='default', password='xxxxx@xxxxx', database='default')
result = client.execute("select * from lotto limit 2")
for row in result:
    print(row)
    
client.disconnect()

若是查询语句带了Date32类型的字段,就会报错 KeyError: -25567,原因是表里记录的创建时间字段的值都是'1900-01-01',clickhouse系统默认时间,python无法处理,改成其他时间即可解决问题。

执行插入

复制代码
#引入库
from clickhouse_driver import Client
# 建立连接,注意这里的参数赋值方式
client = Client(host='xx.xx.xx.xx', port=8900, user='default', password='xxxxx@xxxxx', database='default')
insert_sql = 'INSERT INTO `default`.lotto(id, `number`,award_date, award_result, f1, f2, f3, f4, f5, b1, b2)VALUES'
data = [(uuid.uuid4().__str__(), '123', datetime.datetime.strptime('2024-01-17', '%Y-%m-%d').date(), '012325', '01', '1', '2', '3', '4', '5', '6', datetime.datetime.strptime('2024-01-17', '%Y-%m-%d').date())]
result = client.execute(insert_sql, data)
for row in result:
    print(row)
    
client.disconnect()

执行插入时,data的拼接是有规则限制的;

  1. data 要是一个列表类型(即使插入一行),里面是一行行要插入的记录,记录要使用元组类型封装
  2. 日期不能直接写 '2024-01-17'字符类型,不然会报错,需要转成datetime.date类型
  3. UUID生成的类型不是字符类型,需要转成对应的字符类型
相关推荐
QQ14220784494 分钟前
IIS + wfastcgi 部署 Flask 应用实战:从连续 500 到稳定 200 的完整踩坑实录
python
聚美智数14 分钟前
车辆合格证OCR识别-机动车合格证识别-车辆合格证OCR‑机动车出厂证解析‑整车参数提取 API 接口介绍
数据库·经验分享
WiKiLeaks_successor16 分钟前
Scipy库里的众数函数不严谨,我把它重构了。
python·scipy
DBA_G18 分钟前
南大通用技术分享:GBase 8a数据库执行计划架构原理解析
数据库
傻啦嘿哟21 分钟前
房产数据对比爬虫:同时爬取链家+贝壳+安居客,做房价横向对比
python
小静AI工程实验室25 分钟前
JS 逆向接口 ID 变了?Python 与 Node.js 复现 JSON 大整数精度丢失
javascript·python·node.js
QQ_216962909625 分钟前
基于SpringBoot+Vue的小生活平台的设计与实现
java·数据库·vue.js·spring boot·spring·微信小程序·生活
李航198328 分钟前
用 DeepDraw 几何引擎开发建筑设计软件(五):创建选择工具
python·3d
Metaphor69233 分钟前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
考虑考虑8 小时前
数据库中的EXISTS
运维·数据库·后端