记录django连接clickhouse的一个坑

527 阅读1分钟

前言

最近有个需求,需要连接clickhouse拿数据。一开始准备拿navicat连接,发现navicat连接不了,所以又特意下载了DBeaver去连,使用DBeaver连clickhouse也有不少坑,后续如果有时间的话会写出来。

django配置

我选择下载了django-clickhouse-backend包,pip install django-clickhouse-backend 。包下载完后在django的setting中配置数据库信息,如下图:

image.png

重点: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,发现就不报错了,能连接成功了。