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 小时前
[数据库SQL] [leetcode-175] 175. 组合两个表
数据库·sql·leetcode
WoY202014 小时前
conda修改镜像源遇到的问题:defaults(默认镜像源)清不干净导致创建环境失败
linux·python·conda
dingchengyu14 小时前
Oracle 数据库中递归查询
数据库·oracle
在风中的意志14 小时前
[数据库SQL] [leetcode-183] 183. 从不订购的客户
数据库·sql
渡我白衣14 小时前
计算机组成原理(11):加法器
python·机器学习·numpy·pandas·matplotlib·计组·数电
档案宝档案管理14 小时前
一键对接OA/ERP/企业微信|档案宝实现业务与档案一体化管理
大数据·数据库·人工智能·档案·档案管理
毕设十刻14 小时前
基于Vue的养老服务平台85123(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
liulanba14 小时前
AI Agent技术完整指南 第二部分:开发框架
网络·数据库·oracle
X.Ming 同学14 小时前
深度解析 Qt 自定义图表视图:频谱图 的设计与高级功能拓展
服务器·网络·数据库
程序猿_极客14 小时前
【node期末作业开发】Node.js+MySQL 实现销售信息管理系统的增删改查(附源码)
数据库·mysql·node.js