前言
最近有个需求,需要连接clickhouse拿数据。一开始准备拿navicat连接,发现navicat连接不了,所以又特意下载了DBeaver去连,使用DBeaver连clickhouse也有不少坑,后续如果有时间的话会写出来。
django配置
我选择下载了django-clickhouse-backend包,pip install django-clickhouse-backend 。包下载完后在django的setting中配置数据库信息,如下图:
重点:ENGINE需要写成这样的“clickhouse_backend.backend”。
配置好之后,写接口代码,如下:
@action(methods=['post'],detail=False, permission_classes=[])
def anomaly_contrast(self, request):
"""
电压限制比对
"""
with connections['clickhouse'].cursor() as cursor:
cursor.execute("SELECT count(*) FROM lims_record_data1")
results = cursor.fetchall()
print(results)
return DetailResponse(msg="比对成功")
坑
之后我使用postman测试一下,发现会出现如下报错:
packet_type = read_varint(self.fin) File "clickhouse_driver\varint.pyx", line 62, in clickhouse_driver.varint.read_varint File "clickhouse_driver\bufferedreader.pyx", line 55, in clickhouse_driver.bufferedreader.BufferedReader.read_one File "clickhouse_driver\bufferedreader.pyx", line 240, in clickhouse_driver.bufferedreader.BufferedSocketReader.read_into_buffer EOFError: Unexpected EOF while reading bytes
解决方法
在网上简单搜了一下,都没找到解决方法。后面就换成clickhouse_driver连接了,以下为连接示例。
def get_data_from_clickhouse():
client = Client(
host=settings.CLICKHOUSE_SETTINGS['HOST'],
port=settings.CLICKHOUSE_SETTINGS['PORT'],
user=settings.CLICKHOUSE_SETTINGS['USER'],
password=settings.CLICKHOUSE_SETTINGS['PASSWORD'],
database=settings.CLICKHOUSE_SETTINGS['DATABASE']
)
result = client.execute('SELECT * FROM your_table')
return result
这里面的port改成9000,就能成功。为啥改成9000请看连接,clickhouse连接端口
我突发奇想,把setting里面的也改成了9000,发现就不报错了,能连接成功了。