ClickHouse数据库之Python篇

标签: Clickhouse 分类: 数据库 创建时间:2020-08-06 00:20:35 更新时间:2023-10-20 11:23:25

使用Python连接ClickHouse,有很多种方式,比如:infi.clickhouse_orm、clickhouse-driver、clickhouse-client、aiochclient等,在使用的时候,多多少都会有各种各样的问题。

参考文章:
1.Client Libraries from Third-party Developers (官方已经不维护的第三方列表)
2.clickhouse的python库:clickhouse-driver使用 (使用clickhouse-driver连接clickhouse,看起来还是比较简单的)
3.利用python连接clickhouse数据库 (这篇文章是后来看到了,主要是使用了clickhouse-driver这个连接库)

1.aiochclient安装

1
2
3
4
5
6
7
8
## 升级pip3
python3 -m pip install --upgrade pip

## 使用pip命令安装aiochclient
pip3 install aiochclient

## 加上相关的依赖,我这里安装了python3版本的,最后我还是没有安装成功ciso8601,但是不影响程序运行
pip3 install cChardet aiodns ciso8601

问题

(1) Microsoft Visual C++ 14.0 is required.
安装ciso8601的时候,出现了这个问题。

解决方法就是:Use the link to Visual C++ 2015 Build Tools. That will install Visual C++ 14.0 without installing Visual Studio.也就是安装 Visual C++ 2015 Build Tools,这样就可以安装Visual C++ 14.0,但是不用安装Visual Studio。

(2) fatal error C1083: Cannot open include file: ‘Python.h’: No such file or directory
MS Visual C++14.0安装完成之后,再次执行安装ciso8601,还是报错了,这次没有显示 Microsoft Visual C++ 14.0 is required.而是显示了找不到Python.h文件。

2.示例

如下代码,是可以正常运行的,可以在数据库种插入相应的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import asyncio
from aiochclient import ChClient
from aiohttp import ClientSession

async def main():
async with ClientSession() as s:
client = ChClient(s,url='http://192.168.1.90:8123/',user='xxx',password='xxx',database='xxx')
alive= await client.is_alive() # returns True if connection is Ok
print(alive)
sql='INSERT INTO phalgorithm.pipeHeatAnalyse(id,calcTable) values (4,3)'
await client.execute(sql)

if __name__ == '__main__':
asyncio.run(main())

问题

1.当上面的sql语句变成了下面的sql语句,再次执行,就会出现错误:Missing columns: ‘DDSFASDFAS’ while processing query: ‘DDSFASDFAS’。需要改为正确的语句,注意单引号和双引号的位置。

1
2
3
4
## 错误的sql语句
sql='INSERT INTO phalgorithm.pipeHeatAnalyse(id,calcTable) values (4,"DDSFASDFAS")'
## 正确的sql语句
sql="INSERT INTO phalgorithm.pipeHeatAnalyse(id,calcTable) values (4,'DDSFASDFAS')"

这是正确执行的结果:


2.第二个问题,就是sql语句中,不能包含中括号,即使数据库创建的时候,字段设置为字符串类型,比如上面的calcTable字段。

1
## 错误的sql语句

这个就比较头疼了,加入我想插入一个json字符串怎么办呢?我这个calcTable字段必须包含中括号啊。但是只要你在sql语句中出现了中扩号,就会被识别为一个字段,然后报没有相应的列的问题。

根据我查看错误的最后一行,使用Ctrl+鼠标左键,可以通过VS Code进入到相应的源码中,问题主要出在 query = query.format(**query_params) 上,于是我查了相关的资料,找到了一个在字符串中加入f参数的方法

1
sql=f"INSERT INTO phalgorithm.pipeHeatAnalyse(id,calcTable) values (4,'{'DDSFASDFAS':'dsf'}')"

经过测试这种方法还是不行的。但是找打了问题的根本原因,就是client调用了format方法,但是format方法会根据参数进行填充,所以就不能有中括号,比如下面的语句,就会把GeeksforGeeks填充到第一个中括号中。

1
2
print ("{}, A computer science portal for geeks."
.format("GeeksforGeeks"))

知道了问题的所在,那就好办了,只要找到输出原生中括号的方法就行了。经过测试,最后是通过两个中括号来代替一个中括号的方法进行转义。

1
2
3
4
5
## 正确的sql语句
sql="INSERT INTO phalgorithm.pipeHeatAnalyse(id,calcTable) values (4,'{{\"pp\":\"dsf\"}}')"

## 正确的sql语句
sql='INSERT INTO phalgorithm.pipeHeatAnalyse(id,calcTable) values (4,\'{{"pp":"dsf"}}\')'
参考文章:
1.Python SQL query string formatting
2.[python]str.format输出花括号本身 (这个方法不行)
3.Python | format() function (这个时python中format方法的使用)

3.Python asyncio报错 RuntimeError: asyncio.run() cannot be called from a running event loop
解决方法:

1
pip install tornado
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。