简单点击方言
clickhouse-sqlalchem的Python项目详细描述
连接参数
clickhouse sqlalchemy对连接字符串使用以下语法:
'clickhouse+<driver>://<user>:<password>@<host>:<port>/<database>[?key=value..]'
其中:
- driver是要使用的驱动程序。可能的选择:http,native。http是默认值。
- database是数据库连接到的。默认值是default。
驱动程序选项
查询字符串中可以指定多个选项。
http
- port是clickhouse服务器绑定到的端口。默认值是8123。
- timeout秒。默认情况下没有超时。
- 要使用的协议。可能的选择:http,https。http是默认值。
数据库连接字符串测试在默认ClickHouse安装中:
'clickhouse://default:@localhost/test'
当您使用nginx作为clickhouse服务器连接字符串的代理服务器时,可能看起来像:
'clickhouse://user:password@example.com:8124/test?protocol=https'
其中8124是代理端口。
本地
请注意,本机连接未加密所有数据包括 用户/密码以纯文本传输你应该使用这个连接 通过不受信任的网络进行通信时使用ssh或vpn(例如)。
数据库连接字符串测试在默认ClickHouse安装中:
'clickhouse+native://default:@localhost/test'
所有连接字符串参数被代理到
功能
SQLAlchemy声明性支持
声明式和构造函数式表都支持:
fromsqlalchemyimportcreate_engine,Column,MetaData,literalfromclickhouse_sqlalchemyimportTable,make_session,get_declarative_base,types,enginesuri='clickhouse://default:@localhost/test'engine=create_engine(uri)session=make_session(engine)metadata=MetaData(bind=engine)Base=get_declarative_base(metadata=metadata)classRate(Base):day=Column(types.Date,primary_key=True)value=Column(types.Int32)__table_args__=(engines.Memory(),)another_table=Table('another_rate',metadata,Column('day',types.Date,primary_key=True),Column('value',types.Int32,server_default=literal(1)),engines.Memory())
以声明方式创建的表具有小写字母,其中的单词由下划线命名约定分隔。 但是可以通过sqlalchemy__tablename__属性轻松设置自己的属性。
基本DDL支持
您可以发出简单的ddl。示例CREATE/DROP表:
table=Rate.__table__table.create()another_table.create()another_table.drop()table.drop()
基本插入子句支持
简单的批量插入:
fromdatetimeimportdate,timedeltafromsqlalchemyimportfunctoday=date.today()rates=[{'day':today-timedelta(i),'value':200-i}foriinrange(100)]# Emits single INSERT statement.session.execute(table.insert(),rates)
公共sqlalchemy查询方法链接
支持order_by、filter、limit、offset等:
session.query(func.count(Rate.day)) \ .filter(Rate.day>today-timedelta(20)) \ .scalar()session.query(Rate.value) \ .order_by(Rate.day.desc()) \ .first()session.query(Rate.value) \ .order_by(Rate.day) \ .limit(10) \ .all()session.query(func.sum(Rate.value)) \ .scalar()
高级插入子句支持
从选择语句插入:
fromsqlalchemyimportcast# Labels must be present.select_query=session.query(Rate.day.label('day'),cast(Rate.value*1.5,types.Int32).label('value')).subquery()# Emits single INSERT FROM SELECT statementsession.execute(another_table.insert().from_select(['day','value'],select_query))
许多但不是所有的sqlalchemy特性都是现成的。
全部并集示例:
fromsqlalchemyimportunion_allselect_rate=session.query(Rate.day.label('date'),Rate.value.label('x'))select_another_rate=session.query(another_table.c.day.label('date'),another_table.c.value.label('x'))union_all(select_rate,select_another_rate).execute().fetchone()
用于查询处理的外部数据
当前可以与本机接口一起使用。
ext=Table('ext',metadata,Column('x',types.Int32),clickhouse_data=[(101,),(103,),(105,)],extend_existing=True)rv=session.query(Rate) \ .filter(Rate.value.in_(session.query(ext.c.x))) \ .execution_options(external_tables=[ext]) \ .all()print(rv)
覆盖默认查询设置
设置较低的查询优先级并限制执行请求的最大线程数。
rv=session.query(func.sum(Rate.value)) \ .execution_options(settings={'max_threads':2,'priority':10}) \ .scalar()print(rv)
运行测试
mkvirtualenv testenv && python setup.py test
pip将自动安装测试所需的所有模块。
许可证
clickhouse sqlalchemy分布在MIT license下。
如何贡献
- 检查打开的问题或打开一个新的问题,开始围绕功能想法或错误的讨论。
- 在github上分叉the repository,开始对master分支(或其分支)进行更改。
- 编写一个测试,显示bug已经修复或者特性wo如预期
- 发送一个pull请求并对维护程序进行bug操作,直到它被合并并发布。