Python查询InfluxDB报错error parsing query的修复方法咨询
修复InfluxDB Python查询代码的报错问题
我编写了一段用于查询InfluxDB的Python代码,但无法正常运行。代码如下:
import os from influxdb import InfluxDBClient username = u'{}'.format(os.environ['INFLUXDB_USERNAME']) password = u'{}'.format(os.environ['INFLUXDB_PASSWORD']) client = InfluxDBClient(host='127.0.0.1', port=8086, database='data', username=username, password=password) result = client.query("SELECT P_askbid_midprice1 FROM 'DCIX_OB' WHERE time > '2018-01-01';")
执行后触发如下错误:
Press ENTER or type command to continue Traceback (most recent call last): File "graph_influxdb.py", line 11, in <module> result = client.query("SELECT P_askbid_midprice1 FROM 'DCIX_OB' WHERE time > '2018-01-01';") File "/home/ubuntu/.local/lib/python3.5/site-packages/influxdb/client.py", line 394, in query expected_response_code=expected_response_code File "/home/ubuntu/.local/lib/python3.5/site-packages/influxdb/client.py", line 271, in request raise InfluxDBClientError(response.content, response.status_code) influxdb.exceptions.InfluxDBClientError: 400: {"error":"error parsing query: found DCIX_OB, expected identifier at line 1, char 31"}
但使用相同的查询语句SELECT P_askbid_midprice1 FROM 'DCIX_OB' WHERE time > '2018-01-01';在bash中直接查询InfluxDB时可正常运行,请问该如何修复这段代码?
这个问题其实是Python字符串处理的小坑导致的!
你在Python的查询字符串里用单引号包裹表名'DCIX_OB',但Python传递这个字符串给InfluxDB客户端时,单引号会被当成字符串的一部分,导致InfluxDB解析出错——它会把'DCIX_OB'当成一个字符串字面量,而不是表名。但在bash里执行时,shell会帮你处理掉外层的单引号,把DCIX_OB正确识别为表名,所以不会报错。
另外先提个小问题:你代码里原本的第一行import os from influxdb import InfluxDBClient是语法错误,必须分成两行写,这个虽然不是当前报错的原因,但不修正的话代码连模块都导入失败。
现在说修复方案,有两种简单的方式:
方法一:调整引号的使用方式
可以用双引号包裹表名,同时用单引号包裹整个查询语句,避免转义问题:result = client.query('SELECT P_askbid_midprice1 FROM "DCIX_OB" WHERE time > \'2018-01-01\';')如果你的表名
DCIX_OB没有空格、特殊字符,甚至可以直接去掉表名的引号:result = client.query('SELECT P_askbid_midprice1 FROM DCIX_OB WHERE time > \'2018-01-01\';')方法二:使用参数化查询(更推荐)
用参数化查询不仅能避免字符串转义的麻烦,还能降低注入风险,写法如下:query_template = 'SELECT P_askbid_midprice1 FROM "DCIX_OB" WHERE time > %s;' result = client.query(query_template, params=('2018-01-01',))
内容的提问来源于stack exchange,提问作者Jeremie
相关产品推荐
相关产品推荐

