在Python中使用DataFrameClient从InfluxDB查询数据时检索空字典

5ktev3wc  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(119)

我使用Python在InfluxD中创建了一个数据库,代码如下:

from influxdb import InfluxDBClient

host     = 'xx.xxx.xx.xxx'
port     = 8086
username = 'user'
password = 'password'
database = 'dbname'

client = InfluxDBClient(host       = host, 
                        port       = port, 
                        username   = username, 
                        password   = password,
                        verify_ssl = True)

client.create_database(database)

我可以看到数据库已通过使用正确创建:

client.get_list_database()

结果:

[{'name':'dbname'}]

之后,我用下一段代码向数据库发送了一些数据(时间序列)。如您所见,数据存储在名为Hourly_data的数据表(测量)中。我已经使用Grafana检查了信息是否已存储在数据库中。我发送到数据库的数据(代码中的dataframe)是一个 Dataframe ,它有一个名为datedatetime索引和几个不同变量的时间序列。

def data_to_influxdb(data,table_name):
    connection_info = {'host'         : "XX.XXX.XX.XXX",
                       'port'        : 8086,
                       'user'        : 'user',
                       'password'    : 'password',
                       'database'    : 'dbname',
                       'server_tz'   : 'Atlantic/Canary',
                       'reference_tz': 'UTC'}

    client = DataFrameClient(connection_info['host'], connection_info['port'], \
                            connection_info['user'], connection_info['password'], \
                            connection_info['database'])
    
    client.write_points(data, measurement=table_name, \
                        database=connection_info['database'], protocol='json',
                        batch_size = 20000)
    
    # Close session
    client.close()
    
    return

table_name = 'Hourly_data'
data_to_influxdb(dataFrame, tablename)

我想获取数据库中最新数据的日期(最后写入点对应的日期)。当我尝试使用DataFrameClient从数据库查询一些数据时,问题就出现了。我总是得到一个空字典,不管我写什么代码。我已经尝试了这段代码和几个修改,但没有任何效果:

connection_info = {'host'        : "XX.XXX.XX.XXX",
                    'port'        : 8086,
                    'user'        : 'user',
                    'password'    : 'password',
                    'database'    : 'dbname'}

client = DataFrameClient(
                         host       = connection_info['host'], 
                         port       = connection_info['port'],
                         username   = connection_info['user'], 
                         password   = connection_info['password'], 
                         database   = connection_info['database'],
                         )

query = 'SELECT "*" FROM "dbname"."autogen"."Hourly_data"'
client.query(query = query)

这就是我得到的:{}
我使用过的其他替代品:

query = 'SELECT * FROM dbname'
query = 'SELECT * FROM XXX' # wrong name on purpose also turns out into an empty dict {}

我检查了保留政策,似乎没问题:

client.query('SHOW RETENTION POLICIES')
ResultSet({'('results', None)': [{'name': 'autogen', 'duration': '0s', 'shardGroupDuration': '168h0m0s', 'replicaN': 1, 'default': True}]})
carvr3hs

carvr3hs1#

我最终通过使用这个查询解决了这个问题,在这个查询中,我使用测量值或数据表的名称而不是数据库的名称:

query = 'SELECT * from "Hourly_data"'

我想这与我在DataFrameClient连接中指定数据库名称('dbname')有关,因此当访问数据时,只需要指定测量名称('Hourly_data')。否则,DataFrameClient将查找名为“dbname”的测量值。

相关问题