用于Elasticsearch的DBAPI和SQLAlchemy方言
elasticsearch-dbapi的Python项目详细描述
弹性搜索DBAPI
elasticsearch-dbapi
实现了DBAPI(PEP-249)和SQLAlchemy方言,
它在elasticsearch群集上启用SQL访问,以便只进行查询访问。
使用弹性X-PackSQL API
我们目前正在为AWS ES构建对opendistro/_sql
API的支持
此库支持Elasticsearch 7.X版本。在
安装
$ pip install elasticsearch-dbapi
安装AWS ES支架:
^{pr2}$用法:
使用DBAPI:
fromes.elastic.apiimportconnectconn=connect(host='localhost')curs=conn.cursor()curs.execute("select * from flights LIMIT 10")print([rowforrowincurs])
使用SQLAlchemy执行:
fromsqlalchemy.engineimportcreate_engineengine=create_engine("elasticsearch+http://localhost:9200/")rows=engine.connect().execute("select * from flights LIMIT 10")print([rowforrowinrows])
使用SQLAlchemy:
fromsqlalchemyimportfunc,selectfromsqlalchemy.engineimportcreate_enginefromsqlalchemy.schemaimportMetaData,Tableengine=create_engine("elasticsearch+http://localhost:9200/")logs=Table("flights",MetaData(bind=engine),autoload=True)count=select([func.count("*")],from_obj=logs).scalar()print(f"COUNT: {count}")
使用SQLAlchemy反射:
fromsqlalchemy.engineimportcreate_enginefromsqlalchemy.schemaimportTable,MetaDataengine=create_engine("elasticsearch+http://localhost:9200/")logs=Table("flights",MetaData(bind=engine),autoload=True)print(engine.table_names())metadata=MetaData()metadata.reflect(bind=engine)print([tablefortableinmetadata.sorted_tables])print(logs.columns)
连接参数:
elasticsearch-py
是用来建立连接和传输的,这是官方的
弹性python库。Elasticsearch
构造函数接受多个可选参数
它可用于在安全性、性能等方面正确配置连接
以及高可用性。这些可选参数可以在连接字符串中设置,用于
示例:
elasticsearch+http://localhost:9200/?http_compress=True&timeout=100
将传输设置为使用gzip(http_compress)并将超时设置为10秒。在
有关配置选项的详细信息,请参阅elasticsearch-py
的文档:
RFC-1738后面的连接字符串,为了支持多个节点,您应该使用sniff_*
参数
默认情况下,单个查询获取的最大行数 限制在10000。{cd6>可以通过 参数:
fromes.elastic.apiimportconnectconn=connect(host='localhost')curs=conn.cursor(fetch_size=1000)
如果要获取超过10000行 max_result_window 也必须适应。在
测试
运行unittest launch elasticsearch和kibana(kibana确实不是必需的,但拥有kibana很好)
$ docker-compose up -d $ nosetests -v
sql opendistro端点(AWS ES)的特殊情况
AWS ES公开了opendistro SQL插件,它使用了不同的SQL方言。
由于方言和API响应的差异,我们对opendistro SQL提供了有限的支持
在此包上使用odelasticsearch
驱动程序:
fromsqlalchemy.engineimportcreate_engineengine=create_engine("odelasticsearch+https://search-SOME-CLUSTER.us-west-2.es.amazonaws.com:443/")rows=engine.connect().execute("select count(*), Carrier from flights GROUP BY Carrier")print([rowforrowinrows])
或使用DBAPI:
fromes.opendistro.apiimportconnectconn=connect(host='localhost',port=9200,path="",scheme="http")curs=conn.cursor().execute("select * from flights LIMIT 10")print([rowforrowincurs])
已知限制
此库尚不支持以下功能:
- 不支持数组类型列。Elaticsearch SQL也不支持它们。
SQLAlchemy
get_columns
将排除它们。在 object
和nested
列类型不受良好支持,它们被转换为字符串- 名称以
.
开头的索引 - 地理点当前没有得到很好的支持,已转换为字符串
- 对AWS ES的支持非常有限,例如还没有AWS授权
- 项目
标签: