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生成的类型不是字符类型,需要转成对应的字符类型
相关推荐
程序员敲代码吗14 分钟前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
Yyyyy123jsjs17 分钟前
如何通过免费的外汇API轻松获取实时汇率数据
开发语言·python
喵手26 分钟前
Python爬虫实战:GovDataMiner —— 开放数据门户数据集元数据采集器(附 CSV 导出)!
爬虫·python·爬虫实战·python爬虫工程化实战·零基础python爬虫教学·open data·开放数据门户数据集列表
历程里程碑39 分钟前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django
未来的旋律~1 小时前
sqlilabs注入靶场搭建与sql语句
数据库·sql
一个天蝎座 白勺 程序猿1 小时前
KingbaseES查询逻辑优化深度解析:从子查询到语义优化的全链路实践
开发语言·数据库·kingbasees·金仓数据库
我真的是大笨蛋1 小时前
InnoDB行级锁解析
java·数据库·sql·mysql·性能优化·数据库开发
人工智能AI技术1 小时前
【Agent从入门到实践】43 接口封装:将Agent封装为API服务,供其他系统调用
人工智能·python
Darkershadow2 小时前
蓝牙学习之Time Set
python·学习·蓝牙·ble·mesh