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生成的类型不是字符类型,需要转成对应的字符类型
相关推荐
m0_495496415 分钟前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume1 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
Aleeeeex1 小时前
RAG 那点事:从 8 份企业文档到能用的问答系统,全过程拆给你看
人工智能·python·ai编程
2301_809204701 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
虹科网络安全1 小时前
艾体宝产品|深度解读 Redis 8.4 新增功能:原子化 Slot 迁移(上)
数据库·redis·bootstrap
阿坤带你走近大数据2 小时前
怎么查看当前oracle库下的表空间temp大小或者默认大小
数据库·oracle
yoyo_zzm2 小时前
Laravel8.x新特性全解析
数据库·nginx
2301_800976932 小时前
正则表达式
开发语言·python·正则表达式
码界奇点2 小时前
基于Python的新浪微博数据爬虫系统设计与实现
数据库·爬虫·python·毕业设计·新浪微博·源代码管理
AI木马人3 小时前
1.人工智能实战:大模型推理接口响应慢?从模型加载到 FastAPI 部署的完整优化方案
人工智能·python·fastapi