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生成的类型不是字符类型,需要转成对应的字符类型
相关推荐
老胖闲聊21 分钟前
Python Rio 【图像处理】库简介
开发语言·图像处理·python
码界奇点41 分钟前
Python Flask文件处理与异常处理实战指南
开发语言·python·自然语言处理·flask·python3.11
浠寒AI1 小时前
智能体模式篇(上)- 深入 ReAct:LangGraph构建能自主思考与行动的 AI
人工智能·python
敖云岚1 小时前
【Redis】分布式锁的介绍与演进之路
数据库·redis·分布式
weixin_307779131 小时前
Linux下GCC和C++实现统计Clickhouse数据仓库指定表中各字段的空值、空字符串或零值比例
linux·运维·c++·数据仓库·clickhouse
LUCIAZZZ1 小时前
HikariCP数据库连接池原理解析
java·jvm·数据库·spring·springboot·线程池·连接池
我在北京coding2 小时前
300道GaussDB(WMS)题目及答案。
数据库·gaussdb
小Tomkk2 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
行云流水剑2 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
心扬3 小时前
python生成器
开发语言·python