首先下载源码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返回了。