sqlalchemy-clickhouse源码解析

首先下载源码git clone https://github.com/cloudflare/sqlalchemy-clickhouse.git

可以看到里面有个example.py写了使用例子

#!/usr/bin/env python

# Use connector directly
import connector
cursor = connector.connect('tools').cursor()
cursor.execute('SELECT * FROM users LIMIT 10')
print(cursor.fetchone())

# Register SQLAlchemy dialect
from sqlalchemy.dialects import registry
registry.register("clickhouse", "base", "dialect")

# Test engine and table 
from sqlalchemy import *
from sqlalchemy.engine import create_engine
from sqlalchemy.schema import *

engine = create_engine('clickhouse://default:@192.168.1.22:8123/tools')
logs = Table('users', MetaData(bind=engine), autoload=True)
print(select([func.count('*')], from_obj=logs).scalar())

查看connector.connect方法


https://github.com/cloudflare/sqlalchemy-clickhouse.git
https://github.com/cloudflare/sqlalchemy-clickhouse.git

可以看到,其实connect方法就干了一件事,创建Connection对象并返回。

Connection类继承Database类,里面就构造函数做了个初始化数据功能,其他close,commit都是空的,pass。rollback不支持,cursor返回了一个Cursor对象。

例子里connection后就是为了获取这个Cursor对象。

然后调用cursor.execute方法

Cursor类同样也卸载connector.py文件里。

跟Connection类不一样,Cursor类实现的方法还是挺多的,我们先来关注下execute方法

execute方法里首先对传入的sql进行格式化处理,然后更新了下状态,生成了queryId,调用select返回了个生成器response,再调用自身_process_response方法

在_process_response方法里遍历response对象时会进入到Database.select方法,执行真正的查询操作。

发送sql执行查询操作的就是self._send方法,不过这个方法被connector.py里面给覆盖了。

可以看到这里其实是发了个post请求给clickhouse服务器查询数据,毕竟clickhouse提供的是resutful接口的形式操作。

然后就是获取返回报文里面的列名,类型和数据封装成model返回了。

猜你喜欢

转载自blog.csdn.net/u011870280/article/details/80217895